Linux程序调试和性能分析

说实话当年上学的时候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 列出所有加载在内存中并正在执行的进程