文章目录
在Linux性能分析和优化过程中,选用一个好的工具能极大的提高自己的工作效率。这里以Brendan Gregg的Linux性能工具图谱为线索,梳理了Linux系统下各个模块的性能分析工具,并对部分常用工具的用法进行了详细说明。掌握这些工具,可以极大的提高开发者程序性能优化的效果和效率。
静态性能分析工具
文件系统观测工具
# df命令作用是列出文件系统的整体磁盘空间使用情况# -h:--human-readable,以人们易读的GB、MB、KB等格式显示# -a: 显示所有的文件系统; -k 以kb为容量显示单位; -m 以mb为容量显示单位# 指定文件名称是查看文件所在目录磁盘使用情况,不加名称是所有磁盘的使用情况;df -h filename
显示效果如下:
虚拟文件系统(VFS)分析工具
# lsof 是系统管理/安全监测工具, 用来获取和网络相关的信息lsof -i # 显示所有的网络连接lsof -i 6 # 仅获取ipv6的流量lsof -iTCP # 仅显示TCP连接lsof -i :port # 用来显示指定端口的网络信息losf -i@127.0.0.1 # 显示指定到某个主机的连接losf -i@127.0.0.1:22 # 指定到某个主机端口的连接losf -i -sTCP:LISTEN # 找到正在等候连接的端口lsof -i -sTCP:ESTABLISHED # 找出已经建立的连接lsof -u daniel # 查看指定用户打开了什么kill -9 `lsof -t -u daniel` # 杀死指定用户做的一切事情lsof -u ^daniel # 除了daniel用户其它用户做的事情 lsof -c syslog-ng # 查看指定的命令正在使用的文件和网络连接lsof -p 10075 # 查看指定进程ID已打开的内容lsof /var/log/fil # 显示与指定目录/文件交互的所有一切
# pcstat 用于判断一个文件是否被Linux cache缓存# github地址: https://github.com/tobert/pcstat pcstat testfile3|-----------+----------------+------------+-----------+---------|| Name | Size | Pages | Cached | Percent ||-----------+----------------+------------+-----------+---------|| LICENSE | 11323 | 3 | 0 | 000.000 || README.md | 6768 | 2 | 2 | 100.000 || pcstat | 3065456 | 749 | 749 | 100.000 || pcstat.go | 9687 | 3 | 3 | 100.000 || testfile3 | 102401024 | 25001 | 60 | 000.240 ||-----------+----------------+------------+-----------+---------|
磁盘管理工具
# mdadm命令可以进行创建、调整、监控、删除RAID设备mdadm [参数] 设备名mdadm -D # 显示RAID设备的详细信息mdadm -a # 向RAID中添加新设备mdadm -G # 设置RAID设备大小mdadm -E # 显示RAID设备成员的详细信息 # dmsetup(Device mapper setup)的缩写 用于管理硬盘映射器 dmsetup [参数] 逻辑卷名 dmsetup deps # 显示设备的依赖关系dmsetup info # 显示有关磁盘映射器的概述信息dmsetup ls # 显示映射设备的名称列表dmsetup remove # 删除指定的磁盘设备dmsetup status # 显示指定设备中每个目标的状态信息dmsetup table # 显示虚拟设备的映射表
进程资源占用监测
# pidstat 监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况pidstat -u -p ALL # 显示了所有进程的cpu使用率pidstat -u # CPU使用情况统计pidstat -r # 内存使用情况统计pidstat -d # 集成的IO使用情况统计pidstat -w -p 2831 # 显示进程2831的上下文切换情况pidstat -t -p 2831 # 显示选择任务的线程的统计信息外的额外信息pidstat -T TASK # 报告独立的task pidstat -T CHILD # 进程下所有线程统计信息pidstat -T ALL # 报告独立的task和task下面的所有线程
系统库调用分析工具
# ldd 打印程序或者库文件所依赖的共享库列表ldd --version # 打印指令版本号;ldd -v # 详细信息模式,打印所有相关信息ldd -u # 打印未使用的直接依赖ldd -d # 执行重定位和报告任何丢失的对象ldd -r # 执行数据对象和函数的重定位,并且报告任何丢失的对象和函数ldd --help # 显示帮助信息
网络配置
ip link show # 显示网络接口信息ip link list # 用ip命令显示网络设备的运行状态 ip -s link list # 显示更加详细的设备信息 ip link set eth0 up # 开启网卡ip link set eth0 down # 关闭网卡ip link set eth0 txqueuelen 1200 # 设置网卡队列长度ip link set eth0 mtu 1400 # 设置网卡最大传输单元ip link | grep -E '^[0-9]' | awk -F: '{print $2}' # 显示主机的所有网络接口ip addr show # 显示网卡IP信息ip addr add 192.168.0.1/24 dev eth0 # 为eth0网卡添加一个新的IP地址192.168.0.1ip addr del 192.168.0.1/24 dev eth0 # 为eth0网卡删除一个IP地址192.168.0.1ip route show # 显示系统路由ip route list # 显示路由核心表 ip route add default via 192.168.1.254 # 设置系统默认路由ip route list # 查看路由信息ip route add default via 192.168.0.254 dev eth0 # 设置默认网关为192.168.0.254ip route del 192.168.4.0/24 # 删除192.168.4.0网段的网关ip route del default # 删除默认路由ip route delete 192.168.1.0/24 dev eth0 # 删除路由
防火墙配置
# iptables 是Linux上常用的防火墙软件 iptables -F # 清空所有的防火墙规则iptables -X # 删除用户自定义的空链iptables -Z # 清空计数iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT# 22为你的ssh端口, -s 192.168.1.0/24表示允许这个网段的机器来连接,其它网段的ip地址是登陆不了你的机器的。 -j ACCEPT表示接受这样的请求# #本地圆环地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许iptables -A INPUT -i lo -j ACCEPTiptables -A OUTPUT -o lo -j ACCEPTiptables -P INPUT DROP # 配置默认的不让进iptables -P FORWARD DROP # 默认的不允许转发iptables -P OUTPUT ACCEPT # 默认的可以出去# 配置白名单iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允许机房内网机器可以访问iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允许183.121.3.7访问本机的3380端口# 开启相应的服务端口iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 开启80端口,因为web对外都是这个端口iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT # 允许被pingiptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已经建立的连接得让它进来# 保存规则到配置文件中cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改动之前先备份,请保持这一优秀的习惯iptables-save > /etc/sysconfig/iptablescat /etc/sysconfig/iptables# 查看已经设置的规则# iptables -L [-t 表名] [链名]# 四个表名 raw,nat,filter,mangle# 五个规则链名 INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING# filter表包含INPUT、OUTPUT、FORWARD三个规则链iptables -L -t nat # 列出nat上面的所有规则iptables -L -t nat --line-numbers # 规则带编号iptables -L INPUT # 查看某个规则链iptables -L -nv # 查看规则链的详细信息iptables -L -n -v # 查看已添加的规则# 清除已有规则iptables -F INPUT # 清空指定链 INPUT 上面的所有规则iptables -X INPUT # 删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则 # 如果没有指定链名,则会删除该表中所有非内置的链iptables -Z INPUT # 把指定链,或者表中的所有链上的所有计数器清零# 删除已添加的规则iptables -A INPUT -s 192.168.1.5 -j DROP # 添加规则iptables -L -n --line-numbers # 查看规则列表iptables -D INPUT 8 # 删除序号为8的规则 # 开放指定的端口iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口# 屏蔽IP地址iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令# 启动端口映射# 本机的 2222 端口映射到内网 虚拟机的22 端口iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222 -j DNAT --to-dest 192.168.188.115:22# 过滤所有TCP连接中的字符串testiptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset
多路径配置
# multipath 是一个用于管理多路径设备的命令行工具# 常用于处理存储设备中的多路径配置multipath -ll # 显示系统中所有的多路径设备及其状态信息multipath -W # 禁用所有多路径设备multipath -r # 重新扫描并重新发现所有的多路径设备
进程调度
# schedtool是一个用于设置进程调度策略和优先级的命令行工具 schedtool -E <command> # 启动一个新的进程,并使用 schedtool 运行该进程schedtool -B <PID> # 将指定进程设置为后台运行,降低其调度优先级schedtool -F <PID> # 将指定进程设置为前台运行,提高其调度优先级schedtool -D <PID> # 将指定进程设置为非休眠状态,以便更频繁地运行schedtool -N <PID> # 将指定进程设置为休眠状态,降低其调度频率schedtool -p <priority> <PID> # 设置指定进程的静态优先级。较低的值表示较高的优先级。schedtool -R <PID> # 将指定进程设置为实时(Real-time)优先级。schedtool -u <CPU utilization> <PID> # 设置指定进程的 CPU 利用率限制。
系统命令操作
sysctl # 被用于在内核运行时动态地修改内核的运行参数journalctl # 检索 systemd 日志,是 CentOS 7 才有的工具lsmod # 显示已载入系统的模块
查看硬件信息
cat cat /proc/cpuinfo # 查看CPU信息lscpu # 显示有关CPU架构的信息numactl # 工具可用于查看当前服务器的NUMA节点配置、状态,可通过该工具将进程绑定到指定CPUcore
磁盘管理
lsblk # 列出块设备信息 -a 显示所有设备blockdev # 从命令行调用区块设备控制程序fdisk -l # 查看磁盘使用情况和磁盘分区
网络端口
ethtool # 显示或修改以太网卡的配置信息ifconfig # 处于激活状态的网络接口ifconfig -a # 所有配置的网络接口,不论其是否激活ifconfig eth0 # 显示eth0的网卡信息ifconfig eth0 up # 启动网卡ifconfig eth0 down # 关闭网卡# 设置IP 子网掩码 广播地址ifconfig eth0 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.2.255
硬件信息
dmidecode # 在Linux系统下获取有关硬件方面的信息lspci # 显示当前主机的所有PCI总线信息lsusb # 显示本机的USB设备列表信息
监测工具
内核调用监测
# perf 强大的性能分析工具perf top # 动态时实追踪显示占用CPU较高的进程perf report # 重放perf.data的内容perf record -p # 指定追踪进程的PIDperf record -g # 启用进程中函数的调用关系perf record -a # 追踪所有的CPUperf record sleep N # 采集多长时间的数据perf record -ag sleep 10;perf report # 采集10s的数据并分析# CPU使用率很高的常见原因# 第一个原因,进程在不停地崩溃重启,比如因为段错误、配置错误等等# 第二个原因,这些进程都是短时进程,也就是在其他应用内部通过 exec 调用的外面命令。这些命令一般都只运行很短的时间就会结束# ftrace 是一个 Linux 内部的 trace 工具,能够帮助开发者和系统设计者知道内核当前正在干啥,从而更好的去分析性能问题。# SystemTap 是一种跟踪和探测工具,它使用户可以详细研究和监视操作系统(特别是内核)的活动# BCC是一个Python库,简化了eBPF应用的开发过程,并收集了大量性能分析相关的eBPF应用。# LTTng(Linux Trace Toolkit Next Generation)它是用于跟踪 Linux 内核、应用程序以及库的系统软件包.lttng list -k # 列出所有的可追踪内核事件lttng create mysession # 创建一个追踪会话(session)lttng start # 开启追踪lttng enable-event -a -k # 追踪内核所有的探测点和所有的系统调用事件lttng enable-event -a -k --syscall # 追踪所有的系统调用lttng add-context -k -e sched_switch -t pid # 打开一个事件的上下文信息lttng stop # 关闭追踪 lttng destroy # 关闭追踪
系统调用监测
# strace命令 是一个集诊断、调试、统计与一体的工具strace -c # 统计每一系统调用的所执行的时间,次数和出错的次数等.strace -d # 输出strace关于标准错误的调试信息.strace -f # 跟踪由fork调用所产生的子进程.strace -o # 将strace的结果输出到文件中strace -T # 将每个系统调用所花费的时间打印出来strace -p pid # 追踪现有的进程的pid# Trace 主要用来跟踪和记录系统的内核、内核扩展程序和用户程序,尤其是对系统调用,内核服务和中断处理进行详细的记录trace -a # 后台运行trace -l # 循环模式trace -o # 输出到文件trace -T # 表示缓冲区的大小# sysdig 是一个开源系统发掘工具, 用于系统级别的勘察和排障
系统函数调用监测
# ltrace命令 是用来跟踪进程调用库函数的情况ltrace -a # 对齐具体某个列的返回值ltrace -c # 计算时间和调用,并在程序退出时打印摘要ltrace -C # 解码低级别名称(内核级)为用户级名称ltrace -d # 打印调试信息ltrace -e # 改变跟踪的事件ltrace -f # 跟踪子进程ltrace -h # 打印帮助信息ltrace -i # 打印指令指针,当库调用时ltrace -l # 只打印某个库中的调用ltrace -L # 不打印库调用ltrace -o # 把输出定向到文件ltrace -p PID # 附着在值为PID的进程号上进行ltraceltrace -r # 打印相对时间戳ltrace -s STRLEN # 设置打印的字符串最大长度ltrace -S # 显示系统调用。ltrace -t, -tt, -ttt # 打印绝对时间戳ltrace -T # 输出每个调用过程的时间开销
系统性能监测
# Latencytop 通过在内核上下文切换的时候,记录被切换的进程的内核栈,然后通过匹配内核栈的函数来判断是什么原因导致上下文切换# Latencytop 可以用来分析系统延迟# mpstat 用来显示可用CPU的状态# PowerTOP 是一个 Linux 工具,用于诊断电量消耗和电源管理的问题# cat /proc/stat 显示统计数据信息
系统资源监测
# top 可以实时动态地查看系统的整体运行情况(CPU、内存)top -i 时间 # 设置间隔时间top -u 用户名 # 指定用户名 top -p pid # 指定进程top -n 次数 # 循环显示的次数top -H # 所有线程占用资源情况top -I # 忽略失效过程;top -s # 保密模式top -S # 累积模式# 显示列表的字段名称 PID # 进程PID USER # 进程所属用户 PR # 优先级NI # nice值。负值表示高优先级,正值表示低优先级VIRT # 进程使用的虚拟内存总量,单位kb(VIRT=SWAP+RES)RES # 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATASHR # 共享内存大小,单位kbS # 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 %CPU # 上次更新到现在的CPU时间占用百分比%MEM # 进程使用的物理内存百分比TIME+ # 进程使用的CPU时间总计,单位1/100秒COMMAND # 命令名/命令行# 交互命令k # 终止一个进程i # 忽略闲置和僵死进程,这是一个开关式命令q # 退出程序o或者O # 改变显示项目的顺序l # 切换显示平均负载和启动时间信息m # 切换显示内存信息t # 切换显示进程和CPU状态信息c # 切换显示命令名称和完整命令行M # 根据驻留内存大小进行排序P # 根据CPU使用百分比大小进行排序T # 根据时间/累计时间进行排序
# htop 一个互动的进程查看器,可以动态观察系统进程状况# vmstat 显示虚拟内存状态# slabtop 实时显示内核slab内存缓存信息# free 显示内存的使用情况# /proc/meminfo 查看内存信息# sar 系统运行状态统计工具# pidstat 监控进程的系统资源占用情况# pidstat -u 默认的参数,显示各个进程的cpu使用统计# pidstat -r 显示各个进程的内存使用统计# pidstat -d 显示各个进程的IO使用情况# pidstat -w 显示每个进程的上下文切换情况# pidstat -t 显示到线程的统计信息# pidstat -p 指定进程号# ps 查看资源ps axo pid,comm,pcpu # 查看进程的PID、名称以及CPU 占用率ps aux | sort -rnk 4 # 按内存资源的使用量对进程进行排序ps aux | sort -nk 3 # 按 CPU 资源的使用量对进程进行排序ps -A # 显示所有进程信息ps -u root # 显示指定用户信息ps -efL # 查看线程数ps -e -o "%C : %p :%z : %a" | sort -k5 -nr # 查看进程并按内存使用大小排列ps -ef # 显示所有进程信息,连同命令行ps -ef | grep ssh # ps 与grep 常用组合用法,查找特定进程ps -C nginx # 通过名字或命令搜索进程ps aux --sort=-pcpu,+pmem # CPU或者内存进行排序,-降序,+升序ps -f --forest -C nginx # 用树的风格显示进程的层次关系ps -o pid,uname,comm -C nginx # 显示一个父进程的子进程ps -e -o pid,comm,etime # 显示进程运行的时间ps -aux | grep named # 查看named进程详细信息
网络资源监测
# ss 比 netstat 好用的socket统计信息ss -t -a # 显示TCP连接ss -s # 显示 Sockets 摘要ss -l # 列出所有打开的网络连接端口ss -pl # 查看进程使用的socketss -lp | grep 3306 # 找出打开套接字/端口应用程ss src 192.168.119.103:90 # 匹配本地地址和端口号ss dst 192.168.119.113:443 # 匹配远程地址和端口 # tcpdump 一款sniffer工具,是Linux上的抓包工具,嗅探器# iptraf 实时地监视网卡流量# netstat 查看Linux中网络系统状态信息netstat -a # 列出所有端口netstat -at # 列出所有tcp端口netstat -au # 列出所有udp端口 netstat -l # 只显示监听端口netstat -lt # 只列出所有监听 tcp 端口netstat -lu # 只列出所有监听 udp 端口netstat -lx # 只列出所有监听 UNIX 端口netstat -s # 显示所有端口的统计信息netstat -st # 显示TCP端口的统计信息netstat -su # 显示UDP端口的统计信息
I/O资源监测
iostat # 监视系统输入输出设备和CPU的使用情况iotop # 用来监视磁盘I/O使用状况的工具swapon -s # 显示交换区的使用状况cat /proc/swaps # 查看资源交换区的使用情况
性能追踪工具
性能分析和诊断工具
funccount # 其作用在于统计函数被调用的次数funclatency # 获取函数的执行时延kprobe # 为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术argdist # 工具用于探测指定的函数,并收集参数到一个直方图和频率计数器trace # 用于跟踪系统调用和信号的工具。它可以帮助开发人员和系统管理员分析和调试程序的执行过程,以及定位和解决性能问题。cachestat # 分析 Linux 系统缓存统计信息的工具。它可以提供关于文件系统缓存、页缓存和目录项缓存等方面的性能统计数据。filetop # 用于监控文件系统I/O性能的工具 xt4slower # 用于检测ext4文件系统中慢速IO操作的工具ext4dist # 用于测量ext4文件系统中的IO操作分布情况,可帮助分析IO负载的分布情况mdflush # 用于跟踪并显示多磁盘阵列(MD)子系统中的刷新操作opensnoop # 用于实时监测系统中打开文件的过程,可以用于跟踪具体进程打开文件的操作statsnoop # 用于跟踪并显示系统调用的统计信息,可以帮助分析系统调用的使用情况syncsnoop # 用于跟踪并显示文件系统同步操作的工具ugc # 用于分析用户态指令执行的情况,可以显示用户态指令的使用情况和执行时间ucalls # 用于捕获并显示用户态程序中的系统调用信息tcptop # 用于监测和显示TCP连接的使用情况,例如连接数、数据传输量等tcpfile # 用于跟踪和显示TCP文件操作的工具。tcpconnect # 用于跟踪并显示TCP连接的建立操作。tcpaccept # 用于跟踪并显示TCP连接的接受操作。tcpconnlat # 用于测量TCP连接建立过程的延迟时间tcpretrans # 用于跟踪并显示TCP重传的情况gethostlatency # 用于测量主机名解析过程的延迟时间biotop # 用于监测和显示IO操作的使用情况。biosnoop # 用于跟踪并显示IO操作的详细信息。biolatency # 用于测量IO操作的延迟时间。bitesize # 用于统计和显示IO操作的大小分布情况。hardirqs # 用于跟踪并显示硬中断的情况。ttysnoop # 用于跟踪并显示终端输入输出的情况。cpudist # 用于测量和显示CPU使用情况的工具。execsnoop # 用于跟踪并显示进程执行的情况。runlat # 用于测量和显示进程的运行延迟时间。offcputime # 用于显示和分析进程的离线CPU时间。memleak # 用于检测和分析内存泄漏问题。oomkill # 用于跟踪和显示Out-of-Memory(内存不足)杀死进程的情况。slabratetop # 用于监测和显示slab(内核内存分配器)使用情况。llcstat # 用于跟踪和显示最后一级缓存(LLC)的使用情况。profile # 用于生成进程的性能分析报告。capable # 用于跟踪和显示进程权限检查的情况。
CPU性能监测
uptime # 展示系统平均负载和系统运行时间top # 按进程展示系统资源使用情况- 之前总结过mpstat # 按每个 CPU 展示 CPU 使用情况vmstat # 系统整体资源使用情况pidstat # 按进程展示 CPU 使用情况perf # 定时采样调用栈信息、事件统计、PMC 跟踪、跟踪点、USDT probes、kprobes 以及 uprobes 等ftrace # 汇报内核函数调用统计、kprobes 和 uprobes 事件跟踪execsnoo # 列出新进程的运行信息exitsnoop # 列出进程运行时长和退出原因runqlat # 统计 CPU 运行队列的延迟信息runqlen # 统计 CPU 运行队列的长度runqslower # 当运行队列中等待时长超过阈值时打印cpudist # 统计在 CPU 上运行的时间profile # 采样 CPU 运行的调用栈信息
来源地址:https://blog.csdn.net/yang1fei2/article/details/132532094