pid max导致fork: Cannot allocate memory 的分析及解决办法
来源:互联网 发布:多线程编程面试 编辑:程序博客网 时间:2024/06/06 16:29
事情起因是有台生产环境的服务器down了,ssh连接不上去。就在大家准备去机房检查该机器的时候,突然又可以ssh登录了。但是只有一个同事成功登录,其他人依然无法连接。在成功登录的同事终端上执行任何命令,都会报如下错误:
这就很尴尬了:啥都没法调查。
后来多试验几次,偶尔能执行成功:
可以看出memory还有很多,不可能是内存耗尽问题。
当时想不通是啥情况。 今天查询资料无意中发现:当环境中有过多process,超过pid max可能会导致这个报错。
于是试验了下:
1. 查询pid_max值并修改(原来值挺大,为了测试改小点)
2. 测试
# cat test.c
编译后运行
3. 此时再用其他终端试图ssh该测试环境,发现无法登录。
4. 在其他已经连接该测试环境的终端(运行a.out之前就连接好)试图执行free或者其他命令,结果报错-bash: fork: Cannot allocate memory
至此可以初步得出结论:确实pid max用尽会导致fork问题。
解决办法就是修改pid max
上文提到的sysctl -w 修改只是临时修改,重启后会丢失。
# free-bash: fork: Cannot allocate memory
这就很尴尬了:啥都没法调查。
后来多试验几次,偶尔能执行成功:
# freetotal used free shared buff/cache availableMem: 7814784 340028 6688016 9488 786740 7244604Swap: 2097148 0 2097148
可以看出memory还有很多,不可能是内存耗尽问题。
当时想不通是啥情况。 今天查询资料无意中发现:当环境中有过多process,超过pid max可能会导致这个报错。
于是试验了下:
1. 查询pid_max值并修改(原来值挺大,为了测试改小点)
# sysctl kernel.pid_maxkernel.pid_max = 32768# sysctl -w kernel.pid_max=500kernel.pid_max = 500
2. 测试
# cat test.c
#include <unistd.h> #include <stdio.h> int main () { pid_t fpid; //fpid表示fork函数返回的值 int count=0; while(1) { fpid=fork(); if (fpid < 0) { printf("error in fork!\n"); break; } else if (fpid == 0) { count++; } else { sleep(100); return 0; } } printf("count is %d\n", count); return 0;}
编译后运行
# gcc test.c; ./a.out error in fork!count is 172
3. 此时再用其他终端试图ssh该测试环境,发现无法登录。
4. 在其他已经连接该测试环境的终端(运行a.out之前就连接好)试图执行free或者其他命令,结果报错-bash: fork: Cannot allocate memory
至此可以初步得出结论:确实pid max用尽会导致fork问题。
解决办法就是修改pid max
上文提到的sysctl -w 修改只是临时修改,重启后会丢失。
永久修改方法:
# echo "kernel.pid_max=99999" >> /etc/sysctl.conf
# sysctl -p
P.S.
64位系统上pid_max最大值为2^22,32位系统上最大值为32768
0 0
- pid max导致fork: Cannot allocate memory 的分析及解决办法
- pid max导致fork: Cannot allocate memory 的分析及解决办法
- -bash: fork: Cannot allocate memory 问题的处理
- -bash: fork: Cannot allocate memory 问题的处理
- -bash: fork: Cannot allocate memory 问题的处理
- -bash: fork: Cannot allocate memory 问题的处理
- redis Can’t save in background: fork: Cannot allocate memory 解决及原理
- mount error(12): Cannot allocate memory解决办法
- redis Can’t save in background: fork: Cannot allocate memory
- Can’t save in background: fork: Cannot allocate memory
- redis Can’t save in background: fork: Cannot allocate memory
- Android cannot allocate memory
- 从Redis fork主进程 Can’t save in background: fork: Cannot allocate memory && vm.overcommit_memory
- Android 启动模拟器是出现“Failed to allocate memory: 8”错误提示的原因及解决办法
- Android 启动模拟器是出现“Failed to allocate memory: 8”错误提示的原因及解决办法
- Android 启动模拟器是出现“Failed to allocate memory: 8”错误提示的原因及解决办法
- Android 启动模拟器是出现“Failed to allocate memory: 8”错误提示的原因及解决办法
- Android 启动模拟器是出现“Failed to allocate memory: 8”错误提示的原因及解决办法
- md5密码加盐
- Eclipse快捷键 10个最有用的快捷键
- ios7 页面适配问题---1
- 在学习HTML——form表单中的label标签时的一点小体会
- 日常代码
- pid max导致fork: Cannot allocate memory 的分析及解决办法
- 有界面(Activity或其他View)的SDK项目混淆发布
- android studio Error:(1, 1) 错误: 非法字符: '\ufeff' 解决方案
- 丰田阿尔法(Alphard)原车屏升级效果
- 洛谷 P1541 乌龟棋
- List,Map和Set的区别
- Ubuntu系统下android开发环境配置
- HDU 1166 - 敌兵布阵(线段树,单点更新)
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈