问题描述
腾讯云单核2G内存,运行程序的时候,程序有时会挂掉了,设置ulimit -c unlimited之后,想要core文件,结果程序运行的时候,直接提示killed,没有出现core文件
调研查询
killed的原因多是因为内存不足了,系统自动将程序杀死,此时没有出现core文件
使用free -h查看内存使用情况
[root@VM_125_247_centos server]# free -h
total used free shared buff/cache available
Mem: 1.8G 699M 325M 424K 814M 963M
Swap: 0B 0B 0B
可用空间还有325M,自己的服务器在使用的时候,每次会将倒排索引的文件加载到内存中,如果是高并发的情况下,就会出现问题
我连续点击我的服务器网页,搜索内容,最后程序被killed了,然后打开系统的日志文件
vim /var/log/messages
搜索我的程序名search,发现如下内容,说明程序占用 内存过大,被killed掉了
317799 Aug 14 10:22:09 VM_125_247_centos kernel: Out of memory: Kill process 6280 (search) score 585 or sacrifice child
317800 Aug 14 10:22:09 VM_125_247_centos kernel: Killed process 6280 (search) total-vm:1628312kB, anon-rss:1133948kB, file-rss:156kB, shmem-rss:0kB
也可以使用top命令去查看某个单一进程使用内存的情况
top -p `pidof search`
search就是执行 程序的时候名称,此时top可以监控单个程序的运行状况
top指令含义
当我们使用top指令查看CPU使用情况的时候,会显示如下内容,各个字段的含义解释一下
%Cpu(s): 4.4 us, 1.7 sy, 0.0 ni, 93.6 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
us 列显示了用户模式下所花费 CPU 时间的百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序
sy 列显示了内核进程所花费的cpu时间的百分比。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
ni 列显示了用户进程空间内改变过优先级的进程占用CPU百分比。
id 列显示了cpu处在空闲状态的时间百分比。
wa 列显示了IO等待所占用的CPU时间的百分比。这里wa的参考值为30%,如果wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者磁盘访问控制器的带宽瓶颈造成的(主要是块操作)。
hi 硬件中断占用CPU
si 软件中断占用CPU
st 丢失时间占用CPU
内核机制
内存不足触发了Linux内核的OOM机制Linux 下有个特性叫作 OOM killer(Out of Memory),从字面的意思可以看出和内存溢出相关,当内存耗尽时,该问题就会出现。在Linux2.6.内核中,当该功能打开后,在内存耗尽时,会根据一定的值计算出一个合适的用户空间的进程给kill掉,以便释放更多的内存,保证整个系统的稳定运行。在系统的日志中通常会有下面的打印日志:Out of memory: kill process 959 (sshd) score 55 or a child。