Linux系统资源限制

一、page allocation failure(页空间分配失败,linux 默认一页是4K)
现象:系统日志kernel:abc:page allocation failure. Order:1,mode:0x20
说明:程序abc·获取连续物理内存失败(内核调用get_free_page函数)Mode:0x20指的原子分配方式。
原因:
1. 物理内存不足,分配制定的order的连续物理内存失败.
2. GFP_ATOMIC类型内存分配失败
解决方法:
1. 增大vm.min_free_kbytes
2. 修改vm.zone_reclaim_mode
vm.min_free_kbytes:
1. 告知内核随时保持多大空闲内存
2. 系统可用内存低于该参数时,系统开始回收cache内存
3. 值越高,内核越早开始回收内存,空闲内存越高
4. 大高太低都有问题
值设置过低,防止系统重新利用内存但是会导致系统挂起系统会OOM杀死内 存。设置过高,让系统内存不足。
如果kswapd进程CPU占用高,就是当空闲内存小于vm.min_free_kbytes系 统就会启动此进程回收内存,直到系统空闲内存达到vm.min_free_kbytes, 所以此进程占用CPU会上升。
vm.zone_reclaim_mode
当某个节点的可用内存不足时:
1. 如果为0,系统会倾向于从其他节点分配内存。
2. 如果为1,系统会倾向于从 本地节点回收cache内存。
多数时候为0
二、 OOM(out of memory)
当内存不足时会将某些进程杀死用于释放系统内存。
原因:
1. linux默认使用memory overcommit(linux对大部分申请内存的请求都 回复”yes”,以便能跑更多更大的程序。因为申请内存后,并不会马上使用内 存。这种技术叫做Overcommit。)
2. 根据内存消耗量,存活时间,oom_adj(权重),选择进程,系统会选择出 占用内存多,回收内存收益最大的进程杀死
解决方法:
1. 根据TOP,PS等工具找到内存占用最大的进程。排查进程是否内存泄露
2. 优化程序减少内存使用。
Vm.overcommit_memory(内存分配策略):
0:启发式策略(默认允许,但是对于过大的内存申请会拒绝)
1:永远允许overcommit(适合那些不能承受内存分配失败的应用)
2:永远禁止overcommit(分配内存不超过swap+RAM*overcommit_ratio/100)
/proc//oom_adj:linux下每个进程都有一个值
1. 取值在-17~15之间,值越高,越容易被杀掉,默认为0.
为什么是-17呢?
因为最后分数是一个16位的整数,所以当值为-17时,oom_score为0,所以当你需要 一个进程不会被杀死时,可以将这个值设置为-17
2. 该值为负:oom_score=系统消耗分数1/(2*(-oom_adj))
3. 该值为正:oom_score=系统消耗分数*(2**oom_adj)
4. 当该值为-17时代表该进程禁止oom_killer
为什么是-17呢?
因为最后分数是一个16位的整数,所以当值为-17时,oom_score为0,所以当你需要 一个进程不会被杀死时,可以将这个值设置为-17
5. 较新的内核使用oom_score_adj=oom_adj*1000/17(范围是-1000~1000)
这两个值是相对应的,改变任何一个值,另外一个值都会改变。
6. linux在计算内存消耗时会将子进程的内存消耗的一般加到父进程,当杀死一个父进程时优先杀死子进程,避免杀死守护进程.
三、Fork:cannot allocate memory
现象:
-bash:fork:cannot allocate memory
原因:
1.系统进程满了,pid_max用尽导致fork失败(/proc/sys/kernel/pid_max)
所以可以修改pid_max值解决此问题。32位系统中默认为32768,64位最大为2^22
内核中:
pid_max=min(pid_max_max,max_t(int,pid_max,PIDS_PER_CPU_DEFULT*num_possible_cpus())),num_possible_cpus()默认为1024,PIDS_PER_CPU_DEFULT为CPU位数,如:32,64
2.kernel.thread-max:线程最大数
工具介绍:
1. 查看进程数量:ps -ef|wc -l或者top
2. 查看线程数量:ps -eLf|wc -l或者top -H
3. 查看某进程的线程数量:top -H -p pid
4. 查看线程和进程的具体对应关系使用htop
5. 查看进程和线程的分布和对用数量pstree
四、resourc temporarily unavailable
现象:
Pthread_creat():resourc temporarily unavailable
原因:
1. linux系统中每个线程都拥有独立的栈空间
2. ulimit -s 查看栈大小,默认为8M
3. 线程结束时候未释放资源
解决方法:
1. 用ulimit -s 减少线程栈的大小
2. 使用pthread_attr_setstacksize在程序中改变线程栈大小
3. 每个线程创建以后都调用pthread_join或者pthread_detach函数
五、Too many open files
原因:
1、 文件句柄数超过了最大值(ulimit -n)
Ulimit -n -S:软限制最大数
Ulimit -n -H:硬限制最大数
解决方法:
1. shell中输入:ulimit -n xxx
2. 在/etc/security/limis.conf中添加
Soft nofile xxx
Hard nofile xxx
注意:
1. 单个进程打开的文件描述符数量不能超过user limit中nofil的soft limit
2. 所有进程打开的文件描述符不能超过/proc/sys/fs/file-max
3. Nofile的soft limit不能超过hard limit
4. Nofile的hard limit不能超过/proc/sys/fs/nr_open
六、cannot assign requested address
原因:
1. linux分配的客户端连接端口用尽,无法建立socket连接
2. 虽然socket正常关闭,但端口不是立即释放,,而处于TIME_WAIT状态
解决方法:
1. 增加端口数量
Net.ipv4.ip_local_port_range=32768 6100
2. 修改短连接为长连接
3. 减少TIME_WAIT连接状态
在/etc/sysctl.conf中加入
·net.ipv4.tcp_tw_reuse=1#表示开启重用。允许将TIME_WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
·net.ipv4.tcp_tw_recycle=1#便是开启TCP连接中TIME_WAIT sockets的快速回收,默认为0,表示关闭
·net.ipv4.tcp_fin_timeout=30#修改系统默认的TIMEOUT时间
·net.ipv4.tcp_max_tw_buckets=10000#表示系统允许同时保持TIME_WAIT状态的最大数量,通过设置它,系统会将多余的TIME_WAIT删除掉。

你可能感兴趣的:(linux)