起因: 表现情况:在跑任务时出现了僵死情况,任务是晚上9点开始跑的,查看log发现在半夜3点多的时候进入了僵死。
接下来按照大佬的教程,用ps auxf查看我们的进程执行到了哪一步:
可以看到是子进程和信号量都还在,但是子进程上属的父进程没有了,应该是被系统杀掉了导致变成了孤儿进程。
因为子进程上属的父进程已经被杀掉了,所以我们无法根据strace -p $pid 来跟踪被杀的父进程。
因此,我们可以cd /proc/22653/,在这里我们可以查看进程状态。cd /proc/之后,你会发现很多的目录和文件,今天首先来介绍的就是那些以数字命名的目录--它们就是linux中的进程号,每当你创建一个进程时,里面就会动态更新多出一个名称为pid的目录,然后你ls -l /proc/pid会发现如下信息:
根据https://www.linuxidc.com/Linux/2012-09/70975.htm,可以看出里面到底都说明了什么
cmdline:这个主要是当前这个进程被运行时的command line,里面包括了运行时指定的一些参数,比如如果是mysqld的话就包括basedir==,datadir==,port=,socket=等等信息,你可以自己尝试一下。
cwd:current working directory,当前的工作目录
environ:这是个比较有用的文件,里面记录了当前进程的一些环境变量,比如一台机器上对同一个系统起多个实例(当然是不同端口、不同数据目录),而你想知道哪个进程对应的是在哪个数据目录起来的(可能是因为你想kill-9其中一个实例,因为你怕弄错,所以的确定哪个进程是对应哪个数据目录),那么此时你该怎么办呢?两者方法:1.strings /proc/pid/environ | grep PWD 2.tr \\0 \\n < /proc/pid/envrion | grep PWD 即可。当然里面还有很多的信息,你可以自己尝试。
exe:这个就是气这个进程的执行文件
fd:进程打开的文件描述符,我记得以前有人使用mysql遇到过two many openfiles的错误,这个就是打开太多的文件导致的,当然你如果只修改mysql里面的参数可能不会起作用,因为可能os上设置了一个比较小的数,所以要两者都调大。
fdinfo:跟上面一个一样,只不过只有文件描述符的值,没有表示这个文件描述符是对应打开的哪个文件。在/proc很多时候都是这样维护的:可能两个文件里面要表示的信息是一样的,但是有一个一般是以人能容易读懂的格式给出。
limits:这个跟fd有一点关联,因为这个里面限制了进程对系统资源的使用额度,比如前面说的你可以打开多少文件,具体的设定你可以修改这个文件/etc/securiry/limits.conf,里面也对每一项说得很清楚,只要会点E文,理解应该没问题
oom_adj/oom_score:这两个与linux的OOM机制有关的文件(关于OOM请看这里),oom_adj相当于一个因子,它值越大,在OOM时更容易被系统kill掉,但最终决定是否被kill的是oom_score,其实计算这个oom_score时,就是根据oom_adj来的,oom_adj更大,计算出来的oom_score就更大,也能容易在OOM时被系统kill掉。当然如果是很重要的服务现场,为了避免出现这种情况设置oom_adj=0就行,表示永远不会因为OOM被kill。
stat/status:这两者要表示的信息都是一样的,进程的基本状态,但是后一个是以人容易读懂的格式给出,怎么分析前者stat的内容-->见这里。
这里顺便提一个问题?我们遇到过通过查看stat里面的CPU time spent in user code(第14个值)这个值是0,不知道是什么原因导致的,有谁知道请留个言告诉一下
当然你会发现我还有很多的项没介绍?最主要的原因是有些我也不懂,其次,对于新手了解这些最常用的应该暂时足够了,等以后自己对它了解了再慢慢更新上来。当然如果你了解那些我没提到的目录、文件,欢迎大家留言互相交流~
同样,可以在cd /proc/22653/下cat status来查看此进程的状态。发现峰值内存也才76g多左右。
根据https://blog.csdn.net/jiankunking/article/details/86010256
VmPeak代表当前进程运行过程中占用内存的峰值.
VmSize代表进程现在正在占用的内存
VmLck代表进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘.
VmHWM是程序得到分配到物理内存的峰值.
VmRSS是程序现在使用的物理内存.
VmData:表示进程数据段的大小.
VmStk:表示进程堆栈段的大小.
VmExe:表示进程代码的大小.
VmLib:表示进程所使用LIB库的大小.
VmPTE:占用的页表的大小.
VmSwap:进程占用Swap的大小.
Threads:表示当前进程组的线程数量.
SigPnd:屏蔽位,存储了该线程的待处理信号,等同于线程的PENDING信号.
ShnPnd:屏蔽位,存储了该线程组的待处理信号.等同于进程组的PENDING信号.
SigBlk:存放被阻塞的信号,等同于BLOCKED信号.
SigIgn:存放被忽略的信号,等同于IGNORED信号.
SigCgt:存放捕获的信号,等同于CAUGHT信号.
CapEff:当一个进程要进行某个特权操作时,操作系统会检查cap_effective的对应位是否有效,而不再是检查进程的有效UID是否为0.
CapPrm:表示进程能够使用的能力,在cap_permitted中可以包含cap_effective中没有的能力,这些能力是被进程自己临时放弃的,也可以说cap_effective是cap_permitted的一个子集.
CapInh:表示能够被当前进程执行的程序继承的能力.
CapBnd:是系统的边界能力,我们无法改变它.
Cpus_allowed:3指出该进程可以使用CPU的亲和性掩码,因为我们指定为两块CPU,所以这里就是3,如果该进程指定为4个CPU(如果有话),这里就是F(1111).
Cpus_allowed_list:0-1指出该进程可以使用CPU的列表,这里是0-1.
voluntary_ctxt_switches表示进程主动切换的次数.
nonvoluntary_ctxt_switches表示进程被动切换的次数.
根据这些都无法找到到底发生了什么,接下来看看系统杀进程日志。使用egrep -i -r 'killed process' /var/log命令
可以看到确实在半夜2点40左右杀掉了两个进程,这两个进程分别是一个运行子进程和一个信号量监控进程。同时可以看到在18号晚上的10点40,系统也杀掉了两个进程,也分别是以后运行子进程和一个信号量监控进程。由此可以猜测,是因为这两个进程被杀导致的进程无法回收,因为这两个进程中的某些资源没有办法被归回导致进程一直在等待。
接着我们查看一下stack的信息来佐证我们的猜测。查看进程的内核堆栈的调试信息,wchan表示导致进程睡眠或者等待的函数
从图里面可以看到,stack中有一个timeout;再看wchan,证明就是这个poll_schedule_timeout导致了我们的程序休眠。
2. poll_schedule_timeout的机制
根据https://blog.csdn.net/yangsong512/article/details/12402345
Poll就是监控文件是否可读的一种机制,作用与select一样。
应用程序的调用函数如下:
int poll(struct pollfd *fds,nfds_t nfds, int timeout);
Poll机制会判断fds中的文件是否可读,如果可读则会立即返回,返回的值就是可读fd的数量,如果不可读,那么就进程就会休眠timeout这么长的时间,然后再来判断是否有文件可读,如果有,返回fd的数量,如果没有,则返回0.
根据https://www.xuebuyuan.com/1006606.html
一、poll机制功能
poll的是一种查询的方式,英文解释 :民意调查
函数原型:int poll(struct pollfd *fds ,nfds_t nfds ,int timeout);
fds为指向待查询的设备文件数组;
nfds描述第一个参数fds中有多少个设备;
timeout为查询不到我们期望的结果进程睡眠的时间;
返回值:查询到期望状态的设备文件个数
struct pollfd {
int fd; /* 文件描述符 */ (待查询的设备)
short events; /* 等待的事件 */(待查询的设备的状态)
short revents; /* 实际发生了的事件 */
}
功能过程描述:应用程序中调用poll查询文件的状态,首先将fds里面的每个设备文件fd取出,调用它们驱动程序的poll函数,查询是否出现我们期望状态,查询完fds里面所有的设备文件得到满足期望状态的设备文件的数量,如果这个数为0,则poll调用将导致进程就进入睡眠状态,睡眠时间由poll函数设定,如果程序在睡眠状态中fds的某个文件出现我们期望状态,那么poll立即返回,否则一直睡眠到睡眠时间结束为止,返回值为0;如果这个数大于0 ,poll返回满足条件的设备数量。
poll相当于open("/dev/xxx",O_RDWR)阻塞打开文件,区别在于当设备文件无数据可读时poll只导致程序休眠固定时间,而open将导致程序一直休眠到有数据为止。
转载:https://blog.csdn.net/weixin_39847103/article/details/106214514