很多人上来就说ps aux,或者top,说对了,但不全啊。面试官要的不是你只说个命令名字,是要看你会不会看输出,会不会根据场景选工具。
top是动态看的,能实时看到每个进程占了多少CPU多少内存,还有负载信息,这个大家都知道。那要是我想一次性把结果导出来做分析,总不能一直盯着top截吧?这时候ps就派上用场了,ps aux能把所有进程的信息一次性列出来,你还能加grep过滤找你要的进程。
那要是我想看进程打开了哪些文件呢?总不能ps吧?这时候就要用lsof了,lsof -p 进程号直接把所有打开的文件、套接字、库都列出来,排查问题的时候太好用了,比如你删了文件但是空间没释放,去看是不是哪个进程还握着这个文件的句柄,一查一个准。
还有想知道进程占了多少内存,除了top,还有个更好用的叫pmap,pmap 进程号能把进程地址空间每一块用了多少内存都列出来,非常详细,找内存泄漏的时候特别有用。
还有现在很多机器都用docker了,你要是会说ctr或者docker top,再加一句能配合nsenter进入容器命名空间看进程,那直接就超出面试官预期了,谁不想要会排查容器问题的人啊。
还有一点要注意,很多人分不清top里的VIRT和RES,经常说错,这里一定要记清楚:VIRT是进程申请的所有虚拟内存大小,包括了还没加载到物理内存的,还有共享库这些,不是真的占了这么多物理内存;RES才是进程实际占用的物理内存大小,这个才是你要看的实际占用,这个点一讲错,直接就露怯了,一定要记牢。
我之前有一次面试,面试官就是让我讲怎么排查一个占了满负载CPU的进程,我就说先top看哪个进程占比高,然后用ps看进程的启动信息,再用top -H看是哪个线程出问题,然后把线程id转成十六进制,用jstack或者gdb去栈里找问题,整个流程说下来,面试官直接说这个问题答得满分。