Maximum number of shared memory segments limited to 32767 in the kernel. why ?.

本文探讨了Red Hat Enterprise Linux中共享内存段数量限制为32767的原因,并提供了修改内核参数以增加共享内存段限制的方法。通过更改内核源文件include/linux/ipc.h中的IPCMNI值,可以将限制提升至45000,从而允许分配更多共享内存段。

https://access.redhat.com/solutions/59416

 SOLUTION 已验证 - 已更新 2016年四月1日01:43 - 

English 

环境

  • Red Hat Enterprise Linux 4, 5, 6, and 7

问题

  • Maximum number of shared memory segments limited to 32767 in the kernel. why ?
  • Increase /proc/sys/kernel/shmmni to more than 32768
  • When the number of segments reaches 32767 shmget gives:

Raw

error 28 (no space left on device)

决议

From kernel source file include/linux/ipc.h  there is a restriction for 32768.

Raw

#define IPCMNI 32768  /* <= MAX_INT limit for ipc arrays (including sysctl changes) */

诊断步骤

Build kernel with below changes:

Raw

--- linux-2.6.18/include/linux/ipc.h     2006-09-20 09:12:06.000000000 +0530
+++ linux-2.6.18/include/linux/rruban-ipc.h     2011-07-12 12:53:58.000000000 +0530
@@ -51,7 +51,7 @@ struct ipc_perm

#ifdef __KERNEL__

-#define IPCMNI 32768  /* <= MAX_INT limit for ipc arrays (including sysctl changes) */
+#define IPCMNI 45000  /* <= MAX_INT limit for ipc arrays (including sysctl changes) */

/* used by in-kernel data structures */
struct kern_ipc_perm

By changing it to 45000, you areable to allocate more than 32768 shared memory segments.

Raw

>   
> # ./shmtest  
> Allocating segment nshmget: Success  
> Allocating segment no 43000

There is a limitation of 32768 currently with all versions of RHEL and upstream Linux.

 

相关的参考文章:https://blog.youkuaiyun.com/msdnchina/article/details/80641613

<think>好的,用户遇到了Greenplum重启时出现的错误:“Do not have enough valid segments to start the array.” 我需要帮他解决这个问题。首先,我得分析可能的原因。根据经验,这个错误通常和段实例(segments)的状态有关。可能的情况包括某些segment没有正常启动、配置文件错误,或者数据目录的问题。 首先,应该检查所有segment的状态。使用gpstate工具,比如gpstate -e和gpstate -m,可以查看哪些segment处于down状态或者镜像同步的问题。如果发现有segment没有启动,可能需要手动启动它们,比如用gpstart -a命令。 另外,用户可能修改过集群配置,比如增加了segment但没正确同步,或者pg_hba.conf文件配置错误。这时候需要检查配置文件的一致性,确保所有主机上的配置相同,特别是postgresql.conf和pg_hba.conf。如果有修改,可能需要重新加载配置或者重启服务。 数据目录的问题也不容忽视。比如磁盘空间不足、权限错误,或者文件系统损坏。用户需要检查每个segment的数据目录,确保有足够空间,权限正确,并且目录结构完整。如果有损坏,可能需要从备份恢复或者重新初始化segment。 还有可能是由于之前关闭集群时没有正常停止,导致部分segment处于不一致的状态。这时候可以尝试用gpstop -a -M immediate强制停止,然后再启动。如果问题依旧,可能需要使用gprecoverseg来恢复失败的segment,或者用gpinitstandby重建standby master。 如果以上方法都不奏效,可能需要查看segment的日志文件,通常在数据目录的pg_log子目录下。日志中的具体错误信息可以帮助进一步诊断问题,比如端口冲突、资源不足等。 此外,用户的问题中提到引用了一个关于Flume处理换行符的引用,但可能和Greenplum的问题关联不大,不过需要确认是否有数据导入导致的问题,比如数据损坏影响了segment启动,但这种情况比较少见。 用户可能需要逐步排查:先检查segment状态,再检查配置和数据目录,最后查看日志。如果某个segment无法恢复,可能需要重新初始化,或者考虑是否有硬件故障。总之,系统性的检查每一步,找出具体原因再对应解决。</think>### Greenplum重启错误'Do not have enough valid segments to start the array'解决方案 该错误表明Greenplum数据库在重启时无法检测到足够的有效段实例(Segment),通常由以下原因导致: --- #### 一、检查Segment状态 1. **查看所有Segment状态** ```bash gpstate -e # 检查失效的Segment gpstate -m # 检查镜像同步状态 ``` 如果显示某些Segment处于`Down`状态,需手动启动或修复[^1]。 2. **尝试强制启动** ```bash gpstart -a # 强制启动所有Segment ``` --- #### 二、配置文件验证 1. **检查`pg_hba.conf`一致性** 确保所有节点(Master/Segment)的`pg_hba.conf`文件中包含正确的访问规则: ```bash gpcheck -f /tmp/hostfile # 验证配置文件一致性 ``` 2. **检查`postgresql.conf`参数** 确认所有节点的以下参数一致: ```bash port = 5432 max_connections = 250 shared_buffers = 128MB ``` --- #### 三、数据目录修复 1. **验证数据目录权限** ```bash chown -R gpadmin:gpadmin /data/primary # 主Segment目录 chown -R gpadmin:gpadmin /data/mirror # 镜像Segment目录 ``` 2. **检查磁盘空间** ```bash df -h # 确认所有Segment节点有足够存储空间 ``` 3. **重建失效Segment** 若某个Segment持续失效,使用`gprecoverseg`工具: ```bash gprecoverseg -a # 自动恢复 gprecoverseg -r # 重新平衡数据 ``` --- #### 四、关键日志排查 1. **查看Master日志** ```bash cat $MASTER_DATA_DIRECTORY/pg_log/gpstart_*.log ``` 2. **检查Segment日志** 登录具体Segment节点查看: ```bash cat /data/primary/gpseg*/pg_log/*.log ``` --- #### 五、特殊场景处理 1. **Standby Master问题** 若存在Standby Master配置异常: ```bash gpinitstandby -r # 移除失效Standby gpinitstandby -s standby_hostname # 重新创建 ``` 2. **集群初始化重置** 极端情况下可考虑重建集群: ```bash gpstop -a -M immediate gpinitsystem -c cluster_config.yaml ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值