六、性能测试专题
0.项目仓库
1.性能分析工具
1.1 Valgrind
-
Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework), 它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件(plug-in),利用内核提供的服务完成各种特定的内存调试任务。
-
编译安装
wget https://sourceware.org/pub/valgrind/valgrind-3.16.1.tar.bz2 tar -jxvf valgrind-3.16.1.tar.bz2 cd valgrind-3.16.1 ./configure make -j 8 sudo make install
-
使用valgrind
-
为了使valgrind发现的错误更精确,如能够定位到源代码行,建议在编译时加上**-g**参数,编译优化选项请选择**-O0**,虽然这会降低程序的执行效率。
gcc -g -O0 test.c
-
使用命令
valgrind [valgrind-options] your-prog [your-progoptions] valgrind --log-file=./valgrind_report.log --leak-check=full --show-leak-kinds=all --showreachable=no --track-origins=yes your-prog [your-progoptions]
-
1.2 GDB
-
一般要调试某个程序,为了能清晰地看到调试的每一行代码、调用的堆栈信息、变量名和函数名等信息,需要调试程序含有调试符号信息。使用gcc编译程序时,如果加上**-g**选项即可在编译后的程序中保留调试符号信息。
-
除了不加**-g**选项,也可以使用Linux的**strip**命令移除掉某个程序中的调试信息。
strip a.out
-
gdb直接调试目标程序
gdb a.out
-
gdb附加进程
sudo gdb attach pid
-
gdb调试core文件
gdb filename corename
-
Linux系统默认是不开启程序崩溃产生core文件这一机制的,我们可以使用ulimit -a命令来查看系统是否开启了这一机制。开启使用命令:
# 将ulimit -c unlimited放入/etc/profile中,然后执行source /etc/profile即可立即生效。 ulimit -c unlimited
-
系统默认corefile是生成在程序的执行目录下或者程序启动调用了chdir之后的目录,我们可以通过设置生成corefile的格式来控制它,让其生成在固定的目录下,并让每次启动后自动生效。
# 打开/etc/sysctl.conf sudo vi /etc/sysctl.conf # 末尾添加 kernel.core_pattern=/home/gongluck/core_dump/core-%e-%p-%t # 创建目录 mkdir /home/gongluck/core_dump # 执行生效 sudo sysctl -p /etc/sysctl.conf
-
-
gdb命令
命令 说明 run 运行一个程序 continue 让暂停的程序继续运行 next 运行到下一行 step 如果有调用函数,进入调用的函数内部,相当于step into until 运行到指定行停下来 finish 结束当前调用函数,到上一层函数调用处 return 结束当前调用函数并返回指定值,到上一层函数调用处 jump 将当前程序执行流跳转到指定行或地址 print 打印变量或寄存器值当使用print命令打印一个字符串或者字符数组时,如果该字符串太长,print命令默认显示不全的,可以通过在GDB中输入set print element 0命令设置一下,这样再次使用 print命令就能完整地显示该变量的所有字符串了。可以使用**p strerror(errno)**将错误码对应的文字信息打印出来print命令同时也可以修改变量的值,p ennro = 0 backtrace 查看当前线程的调用堆栈 frame 切换到当前调用线程的指定堆栈,具体堆栈通过堆栈序号指定 thread 切换到指定线程GDB提供了一个在调试时将程序执行流锁定在当前调试线程的命令set scheduler-locking on。当然也可以关闭这一选项,使用set scheduler-locking off break 添加断点条件断点的命令是break [lineNo] if [condition] tbreak 添加临时断点 delete 删除断点 enable 启用某个断点 disable 禁用某个断点 watch 监视某一个变量或内存地址的值是否发生变化 list 显示源码 info 查看断点/线程等信息。info functions这个命令会显示程序中所有函数的名词,参数格式,返回值类型以及函数处于哪个代码文件中info threads查看线程信息info args查看当前函数的参数值 ptype 查看变量类型 disassemble 查看汇编代码 set args 设置程序启动命令行参数 show args 查看设置的命令行参数 - GDB调试器提供了一个选项叫follow-fork,可以使用show follow-fork mode查看当前值,也可以通过set follow-fork mode来设置是当一个进程fork出新的子进程时,GDB是继续调试父进程还是子进程(取值是child),默认是父进程( 取值是parent)。
-
开启GDB TUI模式
-
使用gdbtui命令或者gdb-tui命令开启一个调试。
gdbtui -q 需要调试的程序名
-
直接使用GDB调试代码,在需要的时候使用切换键Ctrl + x,然后按a,进入常规GDB和GDB TUI的来回切换。
-
2.Linux系统命令
2.1 基础命令和工具
-
grep搜索字符
参数 作用 -c 仅显示找到的行数 -i 忽略大小写 -n 显示行号 -v 反向选择,仅列出没有关键词的行 -r 递归搜索文件目录 -C n 打印匹配行的前后n行 -
find查找文件
find [指定查找目录] [查找规则] [查找完后执行的action]
参数 作用 -name FILE_NAME 搜索文件名 -iname FILE_NAME 忽略文件名称大小写 -maxdepth n 最多查找n层 -mindepth n 最少查找n层 -size nK 查找文件大小近似nk的文件 -size +nK 查找文件大小大于nk的文件 -size -nK 查找文件大小小于nk的文件 -type d/f 查找目录/文件 -cmin n/+n/-n 查找n分钟左右/以上/以下修改的 -ctime n/+n/-n 查找n天左右/以上/以下修改的 -
ls显示文件
参数 作用 -t 可以查看最新修改的时间 -l 每行显示一个条目 -h 可以结合显示文件的GB、MB等 -R 递归显示 -n 显示组id和gid -
wc计算字数
wc [-clw][--help][--version][文件...]
参数 作用 -c或–bytes或–chars 只显示Bytes数 -l或–lines 只显示行数 -w或–words 只显示字数 –help 在线帮助 –version 显示版本信息 -
uptime机器启动时间+负载
-
ulimit用户资源
ulimit -a
-
curl请求http
参数 说明 -i url 打印请求响应头信息 -I url 仅返回http头 -v url 打印更多的调试信息 -d ‘k=v’ url 使用post方法提交http请求 curl -sw ‘%{http_code}’ url 打印http响应码 -
scp远程拷贝
//下载192.168.1.1的文件 scp gongluck@192.168.1.1:/home/192.168.1.1/test.txt . //上传文件到192.168.1.1 scp test.txt gongluck@192.168.1.1:/home/gongluck/ //下载test整个目录到本地 scp -r gongluck@192.168.1.1:/home/gongluck/test . //上传本地test整个目录到192.168.1.1 scp -r test gongluck@192.168.1.1:/home/gongluck/
-
dos2unix和unix2dos转换换行符
dos2unix filename unix2dos filename
-
sed字符替换
sed 's/原字符串/新字符串/' 文件 sed 's/原字符串/新字符串/g' 文件
2.2 查看活动进程的命令
-
ps进程信息
ps -elf ps -ef
-
top进程cpu内存信息
top top -Hp pid
-
pidstat进程资源
参数 作用 -u 查看cpu相关的性能指标 -w 查看上下文切换情况 -t 查看线程相关的信息,默认是进程的;常与**-w**结合使用(cpu的上下文切换包括进程的切换、线程的切换、中断的切换) -d 展示磁盘I/O统计数据 -p 指明进程号
2.3 内存命令
-
free内存使用情况
free
2.4 CPU使用情况监控命令
- vmstat
- mpstat
2.5 监控磁盘I/O的命令
-
iostatIO 状态
iostat -x iostat -d -k n iostat -dkx m n
-
swapon查看分区使用情况
swapon -s
-
df硬盘使用情况
df -h
-
du目录文件大小
参数 作用 -h 以人类可读的方式显示,显示M或K -a 显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小 -s 显示目录占用的磁盘空间大小,不显示其下子目录和文件占用的磁盘空间大小 -c 显示几个目录或文件占用的磁盘空间大小,还要统计它们的总和 –max-depth=n 查看当前目录下n级子文件和子目录占用的磁盘容量
2.6 查看网络信息和网络监控的命令
-
ifconfig查看和设置网络设备
# 启动关闭指定网卡 ifconfig eth0 up ifconfig eth0 down # 给eth0网卡配置IP地址 ifconfig eth0 192.168.1.2 #给eth0网卡配置IP地址,并加上子掩码 ifconfig eth0 192.168.1.2 netmask 255.255.255.0 #给eth0网卡配置IP地址,加上子掩码,加上个广播地址 ifconfig eth0 192.168.1.56 netmask 255.255.255.0 broadcast 192.168.1.255
-
ping
ping [-dfnqrRv][-c<完成次数>][-i<间隔秒数>][-I<网络界面>][-l<前置载入>][-p<范本样 式>][-s<数据包大小>][-t<存活数值>][主机名称或IP地址]
-
telnet
telnet IP PORT
-
nc
参数 作用 -l 用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作 server,侦听并接受连接,而非向其它地址发起连接。 -p 暂未用到(老版本的nc可能需要在端口号前加-p参数) -s 指定发送数据的源IP地址,适用于多网卡机 -u 指定nc使用UDP协议,默认为TCP -v 输出交互或出错信息,新手调试时尤为有用 -w 超时秒数,后面跟数字 -
mtr连通性测试
mtr url #模拟丢包 sudo tc qdisc add dev eth0 root netem loss 10%
-
nslookup域名解析
nslookup url
-
traceroute路由
traceroute url
-
sar监控工具
参数 作用 -A 所有报告的总和 -u CPU利用率 -v 进程、I节点、文件和锁表状态 -d 硬盘的使用报告 -r 没有使用的内存页面和硬盘快 -g 串口I/O的情况 -b 缓冲区的使用情况 -a 文件的读写情况 -c 系统的调用情况 -R 进程的活动情况 -y 终端设备的活动情况 -w 系统的交换活动 -
netstat查看网络信息
netstat -nap
-
iptraf网络监控
- iptraf是一个实时监控网络流量的交互式的彩色文本屏幕界面。它监控的数据比较全面,可以输出TCP连接、网络接口、协议、端口、网络包大小等信息,但是耗费的系 统资源比较多,且需要管理员权限。
-
tcpdump网络分析
参数 作用 -D 列举所有网卡设备 -i 选择网卡设备 -c 抓取多少条报文 –time-stamp-precision 指定捕获时的时间精度,默认微妙micro,可选纳秒nano -s 指定每条报文的最大字节数,默认262144字节 -
lsof列出打开文件
# 显示端口被某个程序占用 lsof -i:port # 看进程打开了哪些文件 lsof -p pid # 显示abc进程现在打开的文件 lsof -c abc # 显示打开文件abc.txt的进程 lsof abc.txt
2.7 Linux系统的高级工具
-
pstack查看进程调用栈
pstack pid
-
strace跟踪系统调用
strace -p pid
-
proc文件系统
# 显示CPU信息 cat /proc/cpuinfo # 显示内存信息 cat /proc/meminfo # 显示详细的内存映射信息 cat /proc/zoneinfo # 显示磁盘映射信息 cat /proc/mounts # 查看系统平均负载命令 cat /proc/loadavg
Last modified on 2020-12-28