
日志路径:/var/log/messages
服务器上跑的一个程序,发现报了Killed。查看/var/log/messages里的日志,发现以下报错:
[plain] view plain copy
Aug 11 16:28:11 kernel: Out of memory: Kill process 3080 (forward) score 559 or sacrifice child
Aug 11 16:28:11 kernel: Killed process 3080, UID 0, (forward) total-vm:1429064kB, anon-rss:1130444kB, file-rss:136kB
原来linux下也有内存OOM的处理,不同于android 杀掉报OOM的进程,linux是杀掉当前最占用内存的进程。
当Linux报OOM时,意味着整个系统的内存已经不足,如果不杀死进程的话,就会导致系统的崩溃。每个进程都会存有一个oom_score的参数,比如输出pid为988的oom_score:
[plain] view plain copy
cat /proc/988/oom_score
OOM Killer 会在系统报OOM的时候,杀死当前score最高的进程,一般情况也就是占用内存最大的进程。
解决方法:一是增加系统内存,二是优化进程,使其占用内存降低。三是可以使用oom_score_adj参数,这个参数会被计算入oom_score,可以避免进程被杀死(不推荐使用)。
有两种方式:1、直接使用python xxxx.py执行。其中python可以写成python的绝对路径。使用which python进行查询。2、在文件的头部(第一行)写上#!/usr/bin/python2.7,这个地方使用python的绝对路径,就是上面用which python查询来的结果。然后在外面就可以使用./xxx.py执行了。因为在linux中,python啊shell这些程序都是普通的文本格式,都需要一种程序去解释执行它。要么调用的时候指定,要么在文件头指定。原来这是stack size 堆大小 达到最大后,就错误了。在Linux下,这个其实是可以设置的。
使用 ulimit命令即可设置,不但可以设置这个,还可以设置其他很多限制,使用ulimit -a可以查看当前的设置。
ayanmw@ayanmw-desktop:~/server_epoll$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size(512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 4096
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
看到stack size居然是8192KB。
程序一般是分为 堆 和 栈,堆 是存放变量名称的地方,比如指针一个指针 本身占用4个字节,指向一个32位地址(64位系统加倍),一般的变量比如int a,这里a的名称也是一个变量,指向存有值的a的空间地址。
而栈就是放数据的地方,只要内存还有,就可以一直分配,不信你可以使用 一个指针,然后malloc(599999)的大小,进程占用内存就有几十MB了。
可以看到,linux下还可以设置文件大小,打开的文件的数量限制。等等。
============================================
以前发现普通用户无法修改ulimit,root用户 可以.
百度搜索得到:
/etc/security/limits.conf
添加
* soft nofile 8192
* hardnofile 8192
可以修改.
CentOS 或 RedHat这个文件的路径貌似是:
[oracle@qs-xezf-db2 ~]$ cat /etc/sysconfig/limits.conf
oracle softnproc 2047
oracle hardnproc 16384
oracle softnofile 1024
oracle hardnofile 65536
修改文件应该就可以达到效果了.
有人说:在/root/.bashrc中增加:
ulimit -u unlimited
ulimit -n 10240
不一定管用.- -
sysctl -a 可以查看更多系统配置信息.
1、cat /proc/sys/fs/file-max,可以获得整个系统的文件句柄数目。一般是8192。如果希望增加句柄的总数,可以在脚本/etc/rc.d/rc..local中添加一行:echo 10240 >/proc/sys/fs/file-max (举例)
不解:使用lsof -f|wc -l 可以看到当前系统的打开文件总数,我的一台邮件服务器在最疯狂的时候曾输出值为4万!!!就是说同时打开了(或未完全关闭)4万个文件链接。而file-max值为8192,为什么??
2、通过设置/etc/security/limits.conf,实现控制每个进程的文件句柄数目。
添加两行: * soft nofile1024
* hardnofile8192
确认/etc/pam.d/system-auth文件中有下面一行:session required /lib/security/pam_limits.so
如果说每个进程能打开的文件句柄数目限制为8192,那该进程产生的线程所打开的文件句柄数目是限在该8192内?还是又一个8192呢?
这个问题,最后采取了一个比较简单的方法:
在/boot/.bashrc中加入:
ulimit -u unlimited
ulimit -n 20480
然后所有普通用户的open files都变为20480了,用户最大进程数变为ulimited了。
我看到有的地方说AS3要该进程数只能在
1、设置fd_set支持的最大数量
a、修改/usr/include/bits/typesizes.h
#define __FD_SETSIZE 1024 --->65536
b、修改/usr/src/linux/include/linux/posix_types.h
#define __FD_SETSIZE 1024 --->65536
2、修改/usr/src/linux/include/linux/fs.h
设置最大打开文件数量(TCP连接数量)
#define INR_OPEN 1024 --->65536
#define NR_FILE 8192 --->65536
#define NR_RESERVED_FILES 10 --->128
3、修改/usr/src/linux/include/net/tcp.h
a、设置TIMEOUT的时间为1秒
#define TCP_TIMEWAIT_LEN (60*HZ) 60 --->1*HZ
b、设置在backlog队列里的半连接的重试次数,每次都会花相应的时间,本质上也是减少重试时间
#define TCP_SYNACK_RETRIES 5 --->3
然后通过编译内核的方式来增加, 这样比ulimit 更直接修改内核参数.因为内核 是编译出来的.
压力测试:
yuan@yuan-desktop:~$ ab -n 30000 -c 5000 http://localhost/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $>apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost [through 218.19.166.24:3129] (be patient)
socket: Too many open files (24)
提示出错 上网查到是socket系统默认为1024 大于该直就报错 修改.
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)