Linux一次 out of memory经历

2020-05-25 17:26:31 浏览数 (1)

最近在看百度PaddleNlp的模型,本着是骡子是马先拿出来溜溜的原则,于是根据指导安装了Paddle,下载了 短文本语义匹配的模型。

使用:官网说的挺详细了,在实际使用的时候可以通过调用ssh脚本或者直接执行python命令或函数,传入相应的参数即刻。也可通过python自带的 WSGI 构建一个简单的web接口进行调用。

回到题目,在进行模型的推理的时候,自行实现了一个多线程的推理接口,当同时进行了两个推理的时候发现进程被干掉了。而且直接显示: Python进程已杀死。。(话说还是第一次看到这样直接的提示。

于是搜了一下发现有可能是因为内存问题导致OOM了,发现可以通过一个命令查看进程的消耗情况:

journalctl -xb | egrep -i 'killed process'

显示 如下:进程ID 为2284

再往上翻翻,可以看到各个字段的含义如下:

Kernel: [ pid ]    uid  tgid   total_vm  rss           nr_ptes  swapents oom_score_adj name

每列的含义:

pid:进程ID uid:用户ID tgid:线程组ID total_vm:虚拟内存使用(单位为4 kB内存页) rss: Resident Set Size(常驻内存集)单位是内存页数,同样的每页4 KB nr_ptes:页表项 swapents:交换条目 oom_score_adj 通常为0;较低的数字表示当调用OOM杀手时,进程将不太可能死亡。

再往上翻翻(这里可以grep 发生kill的时间,也就是 journalctl -xb | grep 'time')把各个进程的rss项相加,可以算出已使用的内存,我的计算结果是:

916746 * 4 / 1024  = 3.49G

而服务器标的内存就4G。。程序使用的虚拟总内存是 486238 * 4 / 1024 /1024 =1.85 GB; 实际映射到内存中的为 273138 * 4 / 1024 /1024 = 1.04G

因此如果还需要内存的话则超过了系统的内存,导致了内存溢出。

0 人点赞