说实话当年上学的时候Linux的课,一个学期都在安装界面和root目录下面度过(上课时候用学校机器联网打游戏),后悔吗后悔,但是如果再来一次你还会那么做吗?也许还会吧!不说那么多,现在Linux或者类Unix系统统治者绝对的Server端系统,Linux程序调试和性能分析绝对是一个不能忽视的部分,前一段时间公司有前辈在这个点做培训分享就以当时上课时候的大纲做主线来整理和小结下
Linux本身或者开源界前辈已经做了很多工具可以给我们针对Linux程序的性能进行分析,可以监控进行中的进程,查看对应程序的各项指标,命令主要分三个方面程序纬度、进程纬度、系统纬度
。关于Linux编译文件的基础知识这边等看过《深入理解Linux内核》和《深入理解计算机系统》再说,今天这里主要更新相关的命令,主要整理系统纬度的,关于程序和进程纬度的先mark下回头在整理,这里面水很深,深入才能浅出啊!
先摘抄后续在一 一咀嚼消化
基础知识
略这个回头再整理…………………….. 现在实在是有心杀贼无力回天
程序纬度
工具- readelf
功能
– 查看ELF文件内容
用途
– readelf -a 查看ELF所有信息
– readelf -h 查看ELF文件头
– readelf -s 查看ELF文件中的符号表
– readelf -x .data .rodata .bss .text 查看指定节区
工具- objdump
功能
– 显示来自目标 文件 的信息
用途
– objdump –d 反汇编目标文件
– objdump –s 查看ELF文件节区内容
工具- strings
功能
– 获取二进制文件里面的字符串常量
甠途
– 搜索二进制文件中的字符串,比如检查KEY泄露
举例
– strings -f strings_demo|awk -F’: ‘ ‘{print $2}’|grep
‘^.\{16\}$‘
工具-nm
功能
– 获取二进制文件里面包含的符号(二进制文件:可执行文件、目标文件、库文件;符号:函数、变量)
甠途 (示例)
– 跟踪链接错误(尤其是C++、C混编的程序)
重要参数
– -C,把C++函数签名转为可读形式 (认识c++ name mangling)
特别注意
– 不同版本的g++,对于同样C++函数的函数签名可能是不同的,所
以C++库难以跨gcc版本编译使甠
– 如果发现类似问题,先甠nm –C看看有无该函数,如果有,再甠
nm看看函数签名是否一样
工具- strip
功能
– 去除二进制文件里面包含的符号
甠途
– 反编译、反跟踪(基本手段,作甠不大)
– 减小目标文件大小
– 去除调试信息
– 不要随意的对库文件strip,否则…
举例
– strip_demo
工具-ldd
功能
– 显示程序需要使甠的动态库和实际使甠的动态库
甠途
– 解决运行库不匹配的问题
举例
– $ ldd /bin/ls
– librt.so.1 => /lib/librt.so.1 (0x4001a000)
– libc.so.6 => /lib/libc.so.6 (0x4002c000)
– libpthread.so.0 => /lib/libpthread.so.0 (0x4014f000)
– /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
– 第一栏:需要甠什么库;第二栏:实际甠哪个库文件;第三栏:库
文件装载地址
– 如果缺少动态库,就会没有第二栏。
进程纬度
这部分摘抄都不好摘抄,还是回头先理解理解再补上
系统纬度
系统维度-vmstat
功能
– 显示系统整体负载情况
用途
– 性能分析
通常甠法
– vmstat 1 每秒刷新一次结果
举例
系统维度-iostat
功能
– 对系统的磁盘操作活动进行监视
用途
– 性能分析
通常甠法
– Iostat –x
举例
系统维度-netstat
功能
– 显示udp/tcp socket状态
– 接收、发送队列的大小
– udp接收丢包
用途
– 高危端口
– 性能分析
重要显示列
– Recv-Q:Socket接收缓存,满了(比如CPU太忙)就会丢包
举例
– netstat -lpn
– watch netstat -su
tcp:netstat -tnlp
[root@local_centos ~]# netstat -tnlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1494/redis-server 1 tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1520/nginx: master tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 2191/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1479/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1478/cupsd tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::22 :::* LISTEN 1479/sshd tcp6 0 0 ::1:631 :::* LISTEN 1478/cupsd tcp6 0 0 :::3306 :::* LISTEN 2477/mysqld
udp:netstat -unlp
[root@local_centos ~]# netstat -unlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name udp 0 0 0.0.0.0:40580 0.0.0.0:* 861/avahi-daemon: r udp 0 0 0.0.0.0:31655 0.0.0.0:* 1897/dhclient udp 0 0 192.168.122.1:53 0.0.0.0:* 2191/dnsmasq udp 0 0 0.0.0.0:67 0.0.0.0:* 2191/dnsmasq udp 0 0 0.0.0.0:68 0.0.0.0:* 1897/dhclient udp 0 0 0.0.0.0:5353 0.0.0.0:* 861/avahi-daemon: r udp 0 0 127.0.0.1:323 0.0.0.0:* 877/chronyd udp6 0 0 :::20070 :::* 1897/dhclient udp6 0 0 ::1:323 :::* 877/chronyd [root@local_centos ~]#
系统维度-sar
功能
– 性能监控
用途
– 性能分析
通常甠法
– sar –d 1 100
– sar -n DEV 1 100
– sar -u 1 100
系统维度-top
功能
– 显示系统各个进程整体负载情况
用途
– 性能分析
举例
系统维度-iotop
功能
– 显示系统io被各个进程使甠情况
用途
– 性能分析
举例
系统维度-iftop
功能
– 显示系统和各个机器之间的网络收发流量
测试的时候查看是否接受到对应的请求
12.5Kb 25.0Kb 37.5Kb 50.0Kb 62.5Kb └──────────────────┴───────────────────┴──────────────────┴───────────────────┴─────────────────── 192.168.1.108 => 192.168.1.102 2.31Kb 2.80Kb 2.86Kb <= 208b 259b 318b 192.168.1.108 => 192.168.1.1 0b 0b 0b <= 11.6Kb 2.59Kb 3.06Kb 192.168.1.108 => backup.sh.cnc171.net 496b 447b 602b <= 1.18Kb 670b 774b 192.168.1.108 => members.3322.net 1.20Kb 246b 154b <= 1.52Kb 312b 195b 192.168.1.108 => 192.168.1.255 392b 157b 147b <= 0b 0b 0b 192.168.1.108 => li1363-94.members.linode.com 0b 42b 26b <= 0b 69b 43b 192.168.1.108 => 239.255.255.250 488b 98b 122b <= 0b 0b 0b ────────────────────────────────────────────────────────────────────────────────────────────────── TX: cum: 8.31KB peak: 6.58Kb rates: 4.86Kb 3.81Kb 4.15Kb RX: 9.40KB 14.5Kb 14.5Kb 3.95Kb 4.70Kb TOTAL: 17.7KB 19.3Kb 19.3Kb 7.76Kb 8.85Kb
用途
– 性能分析
举例
– iftop -B
系统维度-free
功能
– 显示系统内存使甠情况
用途
– 性能分析
举例
– free -m
– free -g
系统维度-lsof
功能
– 它可以列出某个进程打开的所有文件信息。
用途
– 查看进程打开的普通的文件,目录,nfs文件,块文件,字符文件,共享库,
管道,符号链接,socket流,网络socket,以及其它更多。
举例
– 不带任何参数运行lsof会列出所有进程打开的所有文件
– lsof /tmp/access_log 列出哪些进程使甠某些文件
– lsof -c httpd;lsof -p PID 查找某个程序打开的所有文件
– lsof -i :port 使甠某个端口的进程
– lsof -d mem 列出所有内存映射文件
– lsof -d txt 列出所有加载在内存中并正在执行的进程