linux跟踪命令m linux跟踪进程

Linux系统监控要用到哪些命令记录一下自己常用的linux系统命令,方便以后查阅,发觉记忆越来越不行了
找到最耗CPU的java线程ps命令
命令:ps -mp pid -o THREAD,tid,time或者ps -Lfp pid
结果展示:
这个命令的作用,主要是可以获取到对应一个进程下的线程的一些信息 。比如你想分析一下一个java进程的一些运行瓶颈点,可以通过该命令找到所有当前Thread的占用CPU的时间,也就是这里的最后一列 。
比如这里找到了一个TID : 30834,所占用的TIME时间最高 。
通过 printf "%x\n" 30834 首先转化成16进制,继续通过jstack命令dump出当前的jvm进程的堆栈信息 。通过Grep命令即可以查到对应16进制的线程id信息,很快就可以找到对应最耗CPU的代码快在哪 。
简单的解释下,jstack下这一串线程信息内容:
"DboServiceProcessor-4-thread-295" daemon prio=10 tid=0x00002aab047a9800 nid=0x7d9b waiting on condition [0x0000000046f66000]
nid : 对应的linux操作系统下的tid , 就是前面转化的16进制数字
tid: 这个应该是jvm的jmm内存规范中的唯一地址定位,如果你详细分析jvm的一些内存数据时用得上,我自己还没到那种程度,所以先放下
top命令
命令:top -Hp pid
结果显示:
和前面的效果一下,你可以实时的跟踪并获取指定进程中最耗cpu的线程 。再用前面的方法提取到对应的线程堆栈信息 。
判断I/O瓶颈
mpstat命令
命令:mpstat -P ALL 1 1000
结果显示:
注意一下这里面的%iowait列,CPU等待I/O操作所花费的时间 。这个值持续很高通常可能是I/O瓶颈所导致的 。
通过这个参数可以比较直观的看出当前的I/O操作是否存在瓶颈
iostat命令
命令: iostat -m -x 1 1000
同样你可以观察对应的CPU中的%iowait数据,除此之外iostat还提供了一些更详细的I/O状态数据 , 比如比较重要的有:
avgqu-sz :The average queue length of the requests that were issued to the device. (磁盘队列的请求长度,正常的话2,3比较好 。可以和cpu的load一样的理解)
await : The average time (in milliseconds) for I/O requests issued to the device to be served. (代表一个I/O操作从wait到完成的总时间)
svctm和\util都是代表处理该I/O请求花费的时间和CPU的时间比例 。判断是否瓶颈时,这两个参数不是主要的
r/s w/s 和 rMB/swMB/s 都是代表当前系统处理的I/O的一些状态,前者是我们常说的tps,后者就是吞吐量 。这也是评价一个系统的性能指标
pid命令
命令: pidstat -p pid -u -d -t -w -h 1 1000
结果显示:
相当实用的一个命令,可以基于当个进程分析对应的性能数据 , 包括CPU,I/O,IR , CS等,可以方便开发者更加精细化的观察系统的运行状态 。不过pidstat貌似是在2.6内核的一些较新的版本才有,需要安装sysstat包 。
ubuntu下,可以通过sudo apt-get install sysstat进行安装 。
sar命令
命令:sar -x pid 1 1000
sar也可以指定对应的pid,关注固定的几个参数,没有pidstat那么强大 。看不到对应的I/O, IR等信息 。
sar的功能可以覆盖mpstat , iostat的相关功能 。
dstat命令
命令:dstat -y --tcp 1 1000
通过dstat --tcp可以比较方便的看到当前的tcp的各种状态,不需要每次netstat -nat去看
其他命令
netstat -natp:查看对应的网络链接,关注下Recv-Q , Send-Q , State 。
lsof -p pid :查找对应pid的文件句柄
lsof -i : 80: 查找对应端口被哪个进程占用
lsof/tmp/1.txt :查找对应文件被哪个进程占用
tcpdump / wireshark :抓包分析工具
jstat / jmap / jstack / jps 等一系列的java监控命令
最后
如果你想做一些性能调优的工作,一定要善于利用一些工具进行关注相应的状态 。通过linux命令你可以比较方便的观测到CPU , I/O , network等一些比较外围的状态,很多时候就已经可以解决大部分的问题 。jvm内部的一些运行状态监控,得需要借助一些特有的工具进行细粒度的观测 。
Linux系统中tracert命令使用详解Linux系统中Tracert命令用来显示数据包到达目标主机是所经过的路径 。下面由我为大家整理了linux系统中tracert命令使用详解,希望对大家有帮助!
Linux系统中tracert命令使用详解
Tracert命令用来显示数据包到达目标主机所经过的路径 , 并显示到达每个节点的时间 。命令功能同Ping类似,但它所获得的信息要比Ping命令详细得多,它把数据包所走的全部路径、节点的IP以及花费的时间都显示出来 。该命令比较适用于大型网络 。
命令格式:
tracert IP地址或主机名 [-d][-h maximumhops][-j host_list] [-w timeout]
参数含义:
-d 不解析目标主机的名字;
-h maximum_hops 指定搜索到目标地址的最大跳跃数;
-j host_list 按照主机列表中的地址释放源路由;
-w timeout 指定超时时间间隔,程序默认的时间单位是毫秒 。
linux系统中tracert命令用法
tracert [-d] [-h maximum_hops] [-j computer-list] [-w timeout] target_name
如果不使用参数,将显示连接情况,如图2-23所示 。
提示:
图2-23显示的是从本地计算机到163这台服务器所经过的计算机 。
● -d
指定不将地址解析为计算机名,如图2-24所示 。
● -h maximum_hops
指定搜索目标的最大跃点数,如图2-25所示 。
● -j computer-list
指定沿computer-list的稀疏源路由 。
● -w timeout
每次应答等待timeout指定的微秒数,如图2-26所示 。
补充:linux系统中tracert命令原理
tracert命令也称作路由跟踪命令,用于确定IP数据库包访问目标所采取的路径,通过IP生成时间(TTL)字段和ICMP错误信息来确定 , 从个网络到主机之间的网络状况 。
tracert命令原理与ping命令为相似 , 都是通过向目标发送数据包,并通过数据包响应及丢失情况,从而判断本地与目标主机之间的网络状况,所不同的是tracert命令能够反映出网络中各个路由节点信息,以及网络状况,并且可以用以跟踪路由节点,以及监控服务器状况等作用 。
如何在Linux用户和内核空间中进行动态跟踪你不记得如何在代码中插入探针点了吗? 没问题!了解如何使用uprobe和kprobe来动态插入它们吧 。基本上,程序员需要在源代码汇编指令的不同位置插入动态探针点 。
探针点
探针点是一个调试语句 , 有助于探索软件的执行特性(即 , 执行流程以及当探针语句执行时软件数据结构的状态) 。printk是探针语句的最简单形式,也是黑客用于内核攻击的基础工具之一 。
因为它需要重新编译源代码,所以printk插入是静态的探测方法 。内核代码中重要位置上还有许多其他静态跟踪点可以动态启用或禁用 。Linux内核有一些框架可以帮助程序员探测内核或用户空间应用程序,而无需重新编译源代码 。Kprobe是在内核代码中插入探针点的动态方法之一,并且uprobe在用户应用程序中执行此操作 。
使用uprobe跟踪用户空间
可以通过使用thesysfs接口或perf工具将uprobe跟踪点插入用户空间代码 。
使用sysfs接口插入uprobe
考虑以下简单测试代码,没有打印语句 , 我们想在某个指令中插入探针:
[source,c\n.test.c
#include stdio.h\n#include stdlib.h\n#include unistd.h
编译代码并找到要探测的指令地址:
# gcc -o test test.\n# objdump -d test
假设我们在ARM64平台上有以下目标代码:
0000000000400620 func_1: 400620\t90000080\tadr\tx0, 410000 __FRAME_END__ 0xf6f8
并且我们想在偏移量0x620和0x644之间插入探针 。执行以下命令:
# echo 'p:func_2_entry test:0x620'/sys/kernel/debug/tracing/uprobe_event\n# echo 'p:func_1_entry test:0x644'/sys/kernel/debug/tracing/uprobe_event\n# echo 1/sys/kernel/debug/tracing/events/uprobes/enable# ./test
在上面的第一个和第二个echo语句中,p告诉我们这是一个简单的测试 。(探测器可以是简单的或返回的 。)func_n_entry是我们在跟踪输出中看到的名称,名称是可选字段 , 如果没有提供,我们应该期待像p_test_0x644这样的名字 。test 是我们要插入探针的可执行二进制文件 。如果test 不在当前目录中,则需要指定path_to_test / test 。
0x620或0x640是从程序启动开始的指令偏移量 。请注意在第二个echo语句中,因为我们要再添加一个探针 。所以,当我们在前两个命令中插入探针点之后,我们启用uprobe跟踪,当我们写入events/ uprobes / enable时,它将启用所有的uprobe事件 。程序员还可以通过写入在该事件目录中创建的特定事件文件来启用单个事件 。一旦探针点被插入和启用,每当执行探测指令时 , 我们可以看到一个跟踪条目 。
读取跟踪文件以查看输出:
# cat /sys/kernel/debug/tracing/trac\n# tracer: no\n\n# entries-in-buffer/entries-written: 8/8\n#P:\n\n# _-----= irqs-of\n# / _----= need-resche\n# | / _---= hardirq/softir\n# || / _--= preempt-dept\n# ||| / dela\n# TASK-PID CP\n# |||| TIMESTAMP FUNCTION# | | | |||| | |
我们可以看到哪个CPU完成了什么任务,什么时候执行了探测指令 。
返回探针也可以插入指令 。当返回该指令的函数时,将记录一个条目:
# echo 0/sys/kernel/debug/tracing/events/uprobes/enabl\n# echo 'r:func_2_exit test:0x620'/sys/kernel/debug/tracing/uprobe_event\n# echo 'r:func_1_exit test:0x644'/sys/kernel/debug/tracing/uprobe_event\n# echo 1/sys/kernel/debug/tracing/events/uprobes/enable
这里我们使用r而不是p,所有其他参数是相同的 。请注意,如果要插入新的探测点,需要禁用uprobe事件:
test-3009 [002] .... 4813.852674: func_1_entry: (0x400644)
上面的日志表明,func_1返回到地址0x4006b0,时间戳为4813.852691 。
# echo 0/sys/kernel/debug/tracing/events/uprobes/enabl\n# echo 'p:func_2_entry test:0x630'/sys/kernel/debug/tracing/uprobe_events count=%x\n# echo 1/sys/kernel/debug/tracing/events/uprobes/enabl\n# echo/sys/kernel/debug/tracing/trace# ./test
当执行偏移量0x630的指令时,将打印ARM64 x1寄存器的值作为count = 。
【linux跟踪命令m linux跟踪进程】输出如下所示:
test-3095 [003] .... 7918.629728: func_2_entry: (0x400630) count=0x1
使用perf插入uprobe
找到需要插入探针的指令或功能的偏移量很麻烦,而且需要知道分配给局部变量的CPU寄存器的名称更为复杂 。perf是一个有用的工具,用于帮助引导探针插入源代码中 。
除了perf , 还有一些其他工具,如SystemTap,DTrace和LTTng,可用于内核和用户空间跟踪;然而 , perf与内核配合完美,所以它受到内核程序员的青睐 。
# gcc -g -o test test.c# perf probe -x ./test func_2_entry=func_\n# perf probe -x ./test func_2_exit=func_2%retur\n# perf probe -x ./test test_15=test.c:1\n# perf probe -x ./test test_25=test.c:25 numbe\n# perf record -e probe_test:func_2_entry -e\nprobe_test:func_2_exit -e probe_test:test_15\n-e probe_test:test_25 ./test
如上所示,程序员可以将探针点直接插入函数start和return , 源文件的特定行号等 。可以获取打印的局部变量,并拥有许多其他选项,例如调用函数的所有实例 。perf探针用于创建探针点事件,那么在执行./testexecutable时,可以使用perf记录来探测这些事件 。当创建一个perf探测点时,可以使用其他录音选项,例如perf stat,可以拥有许多后期分析选项,如perf脚本或perf报告 。
使用perf脚本,上面的例子输出如下:
# perf script
使用kprobe跟踪内核空间
与uprobe一样,可以使用sysfs接口或perf工具将kprobe跟踪点插入到内核代码中 。
使用sysfs接口插入kprobe
程序员可以在/proc/kallsyms中的大多数符号中插入kprobe;其他符号已被列入内核的黑名单 。还有一些与kprobe插入不兼容的符号,比如kprobe_events文件中的kprobe插入将导致写入错误 。也可以在符号基础的某个偏移处插入探针,像uprobe一样 , 可以使用kretprobe跟踪函数的返回,局部变量的值也可以打印在跟踪输出中 。
以下是如何做:
; disable all events, just to insure that we see only kprobe output in trace\n# echo 0/sys/kernel/debug/tracing/events/enable; disable kprobe events until probe points are inseted\n# echo 0/sys/kernel/debug/tracing/events/kprobes/enable; clear out all the events from kprobe_events\n to insure that we see output for; only those for which we have enabled
[root@pratyush ~\n# more /sys/kernel/debug/tracing/trace# tracer: no\n\n# entries-in-buffer/entries-written: 9037/9037\n#P:8\n# _-----= irqs-of\n# / _----= need-resche\n# | / _---= hardirq/softirq#\n|| / _--= preempt-depth#\n ||| / delay# TASK-PID CPU#\n |||| TIMESTAMP FUNCTION#\n | | | |||| | |
使用perf插入kprobe
与uprobe一样 , 程序员可以使用perf在内核代码中插入一个kprobe,可以直接将探针点插入到函数start和return中,源文件的特定行号等 。程序员可以向-k选项提供vmlinux,也可以为-s选项提供内核源代码路径:
# perf probe -k vmlinux kfree_entry=kfre\n# perf probe -k vmlinux kfree_exit=kfree%retur\n# perf probe -s ./ kfree_mid=mm/slub.c:3408 \n# perf record -e probe:kfree_entry -e probe:kfree_exit -e probe:kfree_mid sleep 10
使用perf脚本,以上示例的输出:
关于Linux命令的介绍,看看《linux就该这么学》,具体关于这一章地址3w(dot)linuxprobe/chapter-02(dot)html
linux跟踪命令m的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux跟踪进程、linux跟踪命令m的信息别忘了在本站进行查找喔 。

    推荐阅读