本文总阅读量 本站访客数人次 本站总访问量
gongluck's blog
C/C++ Golang 音视频流媒体
性能测试专题

六、性能测试专题

0.项目仓库

1.性能分析工具

1.1 Valgrind

  • Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework), 它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件(plug-in),利用内核提供的服务完成各种特定的内存调试任务。

    valgrind体系结构

  • 编译安装

    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,进入常规GDBGDB 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/ 
    
  • dos2unixunix2dos转换换行符

    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