linux 鸟哥私房菜总结篇—pstree,lsof,fuser, execsnoop

[pstree]

pstree命令以树状图的方式展现进程之间的派生关系,显示效果比较直观。

主要参数

pstree -p  显示pid

           -s  显示家族关系

           -u 显示用户名

skill -STOP 1137 冻结进程      

skill -CONT 1137 解冻进程    

[lsof]

lsof(list open files)是一个查看当前系统文件的工具

普通文件

目录

网络文件系统的文件

字符或设备文件

(函数)共享库

管道,命名管道

符号链接

网络文件(例如:NFS file、网络socket,unix域名socket)

还有其它类型的文件,等等

-a:列出打开文件存在的进程;

-c<进程名>:列出指定进程所打开的文件;

-g:列出GID号进程详情;

-d<文件号>:列出占用该文件号的进程;

+d<目录>:列出目录下被打开的文件;

+D<目录>:递归列出目录下被打开的文件;

-n<目录>:列出使用NFS的文件;

-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )

-p<进程号>:列出指定进程号所打开的文件;

-u:列出UID号进程详情;

-h:显示帮助信息;

-v:显示版本信息。

 lsof  直接跟文件名 。

查看某个端口的进程 加上-t 参数,只显示进程号

 lsof -i  :80 

根据进程号进程打开的文件

lsof -p pid(pid 可以跟多个 中间用逗号分隔)

       4.根据进程名查看进程打开的文件

             lsof -c php-fpm

       5 持续的多次查看进程打开文档

             lsof -p pid -r 2 每2s刷新一次

       6 获取指定用户的进程

lsof -u www-data -p 3590

7 指定对应目录下的文件

     lsof +D  /home/www/linux/

[fuser]

fuser命令用于报告进程使用的文件和网络套接字。fuser命令列出了本地进程的进程号,那些本地进程使用file,参数指定的本地或远程文件。对于阻塞特别设备,此命令列出了使用该设备上任何文件的进程

每个进程号后面都跟随一个字母,该字母指示进程如何使用文件。

c:指示进程的工作目录。

e:指示该文件为进程的可执行文件(即进程由该文件拉起)。

f:指示该文件被进程打开,默认情况下f字符不显示。

F:指示该文件被进程打开进行写入,默认情况下F字符不显示。

r:指示该目录为进程的根目录。

m:指示进程使用该文件进行内存映射,抑或该文件为共享库文件,被进程映射进内存。

1 杀掉访问文件的进程

     fuser -v -k 文件名

2 查看80 端口使用者

fuser -v -n tcp 80  

3 fuser -l 列出所知的信号

 0表示标准输入,1表示标准输出,2表示标准错误,从而可知:所以大多数应用程序所打开的文件的 FD 都是从 3 开始

find . -size 0 -exec rm {} \; 或 find . -size 0 | xargs rm -f

删除空文件夹

[memleak]

内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

内存溢出:分配内存的时候,内存不够分配了.

联系:过多的内存泄露最终会导致内存溢出(OOM)

知乎上大哥的趣谈:

作为一名资深程序猿,我来写一个大家都看得懂的回答。

首先说内存泄露。我们把内存比喻成薪水,每个月发薪水就是内存扩容,上缴工资卡给老婆就是内存泄露!薪水还是那个薪水,虽然没有被花掉,但是你已经失去了控制权。loss control有没有。没错,这就是内存泄露。

再来说内存溢出。每个月公司会发加班费,会以现金的方式发放。你预估每个月的薪水不会超过一万块,于是你买了一个能装一万块钱的钱包。于是每个月的加班费妥妥的被你藏在钱包里,瞒天过海没被老婆发现。突然一个月,公司发了两万块加班费。这时候你的钱包还是装1万块,剩下一万抓在手里。回家的时候,你老婆发现了你手里的一万块,在一番严刑敲打之下,拔出萝卜带出泥,你供出了你钱包的一万块。还有钱包装不下一万块,这就是内存溢出。

有同感的求点个赞,刚被没收钱包里的加班狗,刚被赶出家门在外面冷的瑟瑟发抖ing

作者:锋哥程序十年

链接:https://www.zhihu.com/question/40560123/answer/609403319

[perf]

通过 top、ps、pidstat 等工具,你能够轻松找到 CPU 使用率较高(比如 100% )的进程。接下来,你可能又想知道,占用 CPU 的到底是代码里的哪个函数呢?找到它,你才能更高效、更针对性地进行优化。

第一种常见用法是 perf top,类似于 top,它能够实时显示占用 CPU 时钟最多的函数或者指令,因此可以用来查找热点函数,使用界面如下所示:

再往下看是一个表格式样的数据,每一行包含四列,分别是:

1554110196.png

第一行:分别是采样数(Samples)、事件类型(event)和事件总数量(Event count)

这里perf 共采集了251个CPU时钟事件,而总事件数14907084。采样数要多一点,下面的排 序和百分比才有参考价值。

从第二行开始,第一列百分比(OverHead)是该符号的性能事件在所有采样中的比例。

   第二列 Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),       如内核、进程名、动态链接库名、内核模块名等。

   第三列 Object ,是冬天共享对象的类型。比如[.] 表示用户控件的可执行程序、或者动态链接库,[k] 代表kernel ,表示内核空间。

   第四列 是Symbol符号名,也就是函数名。那些用十六进制地址表示的,表名函数名未知。

用法:

perf top -g 开启调用关系分析 -p 指定php-fpm的进程号

perf top -g -p 1596

记录相关报告

perf record -p 1596 

分析相关数据

perf report -g -p 1596

查看程序运行的情况

perf stat 加进程名

perf stat ./sleep.sh

perf stat 的 解析

perf.png

task-clock 

用于执行程序的CPU时间,单位是ms(毫秒)。第二列中的CPU utillized则是指这个进程在运行perf的这段时间内的CPU利用率,该数值是由task-clock除以最后一行的time elapsed(也就是wall time,真实时间,单位为秒,下面的M/sec等数值都是除以这个数得到的)再除以1000得出的。

2.context-switches:程序在运行过程中发生的上下文切换次数。

3.cpu-migrations:程序在运行过程中发生的CPU迁移次数,即被调度器从一个CPU转移到另外一个CPU上运行

这里要注意下CPU迁移和上下文切换的不同之处:发生上下文切换时不一定会发生CPU迁移,而发生CPU迁移时肯定会发生上下文切换。发生上下文切换时有可能只是把上下文从当前CPU中换出,下一次调度器还是将进程安排在这个CPU上执行。

4 page-faults:缺页。指当内存访问时先根据进程虚拟地址空间中的虚拟地址通过MMU查找该内存页在物理内存的映射,没有找到该映射,则发生缺页,然后通过CPU中断调用处理函数,从物理内存中读取。见下图所示的例子(MMU,Memory Management Unit,是CPU中负责将负责虚拟地址映射为物理地址的单元):

5 cycles:CPU时钟周期。CPU从它的指令集(instruction set)中选择指令执行。一个指令包含以下的步骤,每个步骤由CPU的一个叫做功能单元(functional unit)的组件来进行处理,每个步骤的执行都至少需要花费一个时钟周期。

指令读取(instruction fetch)

指令解码(instruction decode)

执行(execute)

内存访问(memory access)

寄存器回写(register write-back)

stalled-cycles:字面意义是停滞周期,先介绍下instruction pipeline(姑且翻译为指令管道):指令管道是一种可以并行执行多个指令的CPU架构,通过同时执行不同的指令的不同组合实现。

这类似于工厂的组装线,产品的不同阶段可以并行执行以提高吞吐量。考虑前面提到的指令步骤,如果每个步骤需要一个时钟周期,该指令则需要五个时钟周期来完成执行。在这个指令的每个单独的步骤中,只有一个功能单元是运行的,而其他四个是空闲的。通过使用指令管道,多个功能单元可以在同一时间运行,在管道中处理不同的指令。在理想状态下,处理器可以在一个时钟周期中完成一个指令。

而stalled-cycles,则是指令管道未能按理想状态发挥并行作用,发生停滞的时钟周期。

stalled-cycles-frontend指指令读取或解码的指令步骤,而stalled-cycles-backend则是指令执行步骤。第二列中的cycles idle其实意思跟stalled是一样的,由于指令执行停滞了,所以指令管道也就空闲了,千万不要误解为CPU的空闲率。这个数值是由stalled-cycles-frontend或stalled-cycles-backend除以上面的cycles得出的。

instructions:该进程在这段时间内完成的CPU指令,之前在cycles已介绍过了。这是整个perf stat命令输出中最重要的指标值。第二列中的insns per cycle,简称IPC,表示一个时钟周期内能完成多少个CPU指令。该值越高,表示CPU的性能越好。

第二行的stalled cycles per insn,表示完成每个指令,有多少个时钟周期是被停滞的,这个值越小,表示CPU的性能越好。该值是由stalled-cycles-frontend除以instructions得到的。

branches:这段时间内发生分支预测的次数。现代的CPU都有分支预测方面的优化。

branches-misses:这段时间内分支预测失败的次数,这个值越小越好。

L1-dcache-loads:一级数据缓存读取次数。

L1-dcache-load-missed:一级数据缓存读取失败次数。

LLC-loads:last level cache读取次数。

LLC-load-misses:last level cache读取失败次数。

要理解CPU缓存是什么,需要先了解下CPU的缓存架构,如下图:

1. level-1 data cache:一级数据缓存(I$) 

2. level-1 inst cache:一级指令缓存(D$) 

3. MMU:内存管理单元 

4. TLB:转换后援缓存(translation lookaside buffer) 

5. level-2 cache:二级缓存(E$) 

6. level-3 cache:三级缓存 

处理器读取数据过程如下面两个图:

CPU根据虚拟地址尝试从一级缓存(存放的是虚拟地址的索引)中读取数据;

如果一级缓存中查找不到,则需向MMU请求数据;

MMU从TLB中查找虚拟地址的缓存(换言之,TLB是负责改进虚拟地址到物理地址转换速度、存放虚拟地址的缓存);

如果TLB中存在该虚拟地址的缓存,则MMU将该虚拟地址转化为物理地址,如果地址转换失败,则发生缺页(图中的fault分支),由内核进行处理,见上文所述;如果地址转换成功,则从二级缓存(存放的是物理地址的索引)中读取;如果二级缓存中也没有,则需要从三级缓存甚至物理内存中请求;

如果TLB中不存在该虚拟地址的缓存,则MMU从物理内存中的转换表(translation tables,也称为页表page tables)中获取,同时存入TLB;(注意,这个操作是硬件实现的,可以由MMU通过硬件直接从物理内存中读取);

跳到第4步。

由此可见,L1-dcache-load-missed和LLC-load-misses的数值当然是越低越好了。另外还有dTLB-load-misses(dTLB是数据转换后援缓存)和iTLB-load-misses(iTLB是指令转换后援缓存)等指标值

由此可见,L1-dcache-load-missed和LLC-load-misses的数值当然是越低越好了。另外还有dTLB-load-misses(dTLB是数据转换后援缓存)和iTLB-load-misses(iTLB是指令转换后援缓存)等指标值.

[ps]命令,用来报告进程当前的快照

参数:

ps  -e 显示所有进程等同于-A。

ps  -u 显示面向用户的进程格式。

ps  -f 全部列出,通常和其他选项联用。

ps   -x  显示所有程序,不以终端机来区分。

ps  -a 显示所有的用户进程(与ps a 不同)。

ps  -l 长格式输出。

ps   --headers 每页都显示一个头部。

ps.png

STAT  有以下几种状态

D 不可中断的进程

R 正在运行可中在队列中可过行的

S 休眠的进程

T  停止的或被追踪的 Traced or Stop

W 进入内存交换(从内核2.6开始无效)

X 死掉的进程(应该从来没见过)

Z zombie 僵尸进程

I (大写的i) Idle 空闲状态 用在不可中断睡眠的内核线程上

<  优先级高的进程

N 优先级比较低的进程

L 有些页被锁进内存

l (小写L) 多线程 (使用 CLONE_THREAD, 类似 NPTL pthreads)

s 进程的领导者

+ 位于后台的进程组

常用命令:

ps -ef

ps -ely

ps  aux  BSD 语法形式

ps -ejH 

ps -axjf

[execsnoop]

execsnoop是一个shell文件。

 echo -e '[iovisor]\nbaseurl=https://repo.iovisor.org/yum/nightly/f25/$basearch\nenabled=1\ngpgcheck=0' | sudo tee /etc/yum.repos.d/iovisor.repo

apt install 

1554183776.png

 execsnoop

 就是一个专为短时进程设计的工具。它通过 ftrace 实时监控进程的 exec() 行为,并输出短时进程的基本信息,包括进程 PID、父进程 PID、命令行参数以及执行的结果。

假设我们有这样一个场景,系统中偶尔会运行新的进程,这些新的进程可能会消耗大量系统资源,从而对我们生产上运行的环境产生干扰,但是这种进程可能运行时间极为短暂,我们怎样才能知道发生了这种情况呢?top?可能不行,时间太短了,可能top还没来得及统计,进程已经退出了。这种情况下最适合使用的工具之一就是BCC工具集中的execsnoop,图中可以看出,每一个新启动的进程都会被记录在案

参考资料:

https://zhengheng.me/2015/11/12/perf-stat/

https://www.cnblogs.com/hunttown/p/5452253.html

https://www.cnblogs.com/pugang/p/10009896.html

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注