zoukankan      html  css  js  c++  java
  • linux 系统性能分析

    CPU篇

    top

    • 1时,看各个cpu是否均衡;看每个cpu的使用率分布是否合理
    • 看load average的负载( 1分钟、5分钟、15分钟前到现在的平均值)
    • 看内存的使用
    • 看进程数运行、休眠数
    • M看各个进程内存的占用

    只看某些进程的负载 top -p pid1,pid2 

    确认cpu的进程分布 ps -Ef

    还有一个基于top的方法是:在top界面中,按下f.进入top Current Fields设置页面:

    选中:j: P  = Last used cpu (SMP)

    则多了一项:P 显示此进程使用哪个CPU

    另外,mpstat -P ALL 1 可以看到各个核心的统计情况

    可以参考下面的vmstat

    IO篇 

    iostat -x 1

    看cpu的iowait和idle。

    关键是r/s,w/s每秒的读写次数和量

    平均的数据大小和io队列长度(仅参考)

    结合await_time,来看svctm每次io操作的服务时间,前者远大于后者有问题。

    vmstat  2

    procs 中 r的数目大于cpu数,注意了!

    b 表示阻塞的进程数目,即正在等待资源的进程数目,比如正在等待I/O,或内存交换等

    如果swpd的值不为0,或者比较大,比如超过了100m,只要si、so的值长期为0,系统性能还是正常 

    如果cache较大,说明用到cache的文件较多,如果此时IO中bi比较小,说明文件系统效率比较好

    si  每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决

    bi 从块设备读入数据的总量(读磁盘)(每秒kb)。

    bo 块设备写入数据的总量(写磁盘)(每秒kb)
    这里我们设置的bi+bo参考值为1000,如果超过1000,而且wa值较大应该考虑均衡磁盘负载,可以结合iostat输出来分析。

    System

    in 每秒的中断数,包括时钟中断。

    cs 每秒的环境(上下文)切换次数。

    上面2个值越大,会看到由内核消耗的CPU时间会越大 

    Cpu

        us列显示了用户进程消耗的CPU 时间百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,就需要考虑优化程序或算法。

        sy列显示了内核进程消耗的CPU时间百分比。Sy的值较高时,说明内核消耗的CPU资源很多。

    根据经验,us+sy的参考值为80%,如果us+sy大于 80%说明可能存在CPU资源不足。

        wa IO等待消耗的CPU时间百分比。wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。 

    网络篇

    TCP

    cat /proc/net/snmp | grep Tcp:
    Tcp: RtoAlgorithm RtoMin RtoMax MaxConn ActiveOpens PassiveOpens AttemptFails EstabResets CurrEstab InSegs OutSegs RetransSegs InErrs OutRsts
    Tcp: 1 200 120000 -1 78447 413 50234 221 3 5984652 5653408 156800 0 849
    重传率 = RetransSegs / OutSegs

    统计某端口:

    ss -o state established '( sport = :23000 )' | wc -l

    ## 关于某端口的进程连接均衡

    sudo ss -o state established '( sport = :23000 )' -p | awk '{print $6}' | awk -F',' '{print $2}' | sort -n | uniq -c | sort -nr

    netstat -tan | awk '{printf("%s:%s ",$4, $5)}' | awk -F":" '{if ($2==36000 && $4>0) {printf("%s ",$3)}}'

    统计所有的端口:

    netstat -nt | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key," ",state[key]}'

    统计连接最多的服务器:

    netstat -tan | awk '{print $5}' | awk -F":" '{print $1}' | sort | uniq -c | sort -nr

    统计某端口连接过来最多的服务器

    netstat -tan | awk '{printf("%s:%s ",$4, $5)}' | awk -F":" '{if ($2==36000 && $4>0) {printf("%s ",$3)}}'  | sort | uniq -c | sort -nr

    快速查看总体的连接状态数:

    ss -s 

    如何查看连接的时间:

    查看这个进程打开的这个连接的文件名,lsof -p pid | grep port,可以得到这个进程在这个端口上的连接的文件编号: 
    java    32439 root  118u  IPv6          165707367      0t0       TCP SC-HOST-43:51518->192.168.110.231:8998 (ESTABLISHED) 
    java    32439 root  126u  IPv6          165707404      0t0       TCP SC-HOST-43:51520->192.168.110.231:8998 (ESTABLISHED) 
    大家注意到118u和126u是这两个连接的文件名,然后去ll /proc/pid/fd/118,就可以看到这个连接的建立时间了。 

    快速确认是不是长连接:看下面的状态是不是ESTABLISH(没有TIME_WAIT),且端口不发生变化

    netstat -tanp |awk '{print $4,$5,$6}' | grep 21000

    统计某些进程的连接数是否均衡

    netstat -tanp | grep ':9982 '  | awk '{print $7}' | awk -F"/" '{print $1}' | sort | uniq -c |sort

    内存篇

    查看共享内存(有时我们需要知道程序设定的那个id),这样的输出才赏心悦目:

    ipcs -m | grep 0x | awk '{printf("%s %d %s %s %1.2fMB ",$1,$6,strtonum($1),$3,$5/1000000)}'

    ipcs -s | grep 0x | awk '{printf("%s %d %s %s %d ",$1,$2,strtonum($1),$3,$5)}'

    优化方法

    一些系统设定
    • echo -e 'net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1' >> /etc/sysctl.conf && /sbin/sysctl -p
    echo '1024 61000' > /proc/sys/net/ipv4/ip_local_port_range
    echo -e '* hard nofile 102400 * soft nofile 102400' >> /etc/security/limits.conf

    分析整个系统

    结合理论分析进行压测,

    • 不要急于出数据,正确是第一要务
    • 最好是把部署图完整清晰的画出来,多查看日志
    • 压测要有成功率和时延的统计
    • 提前想好要压测的数据结构并制表(在excel中),后续压测逐项填写数据
    • 对系统的每一个模块都要查看其负载,尽可能的消除瓶颈

    # 进程篇

    perf record -a -e cycles -o cycle.perf -g sleep 10 perf report -i cycle.perf >test.log

    设计系统时,应该现将单机跑满,然后再整体

  • 相关阅读:
    软工5--结对2--四则运算生成器
    软工4——结对审查
    天数计算器
    翻转字符串
    位图排序
    软工 assignment 3 —— 求最大子数列之和
    剑指offer 面试题5.替换空格
    剑指offer 面试题4.二维数组中的查找
    剑指offer 面试题3.数组中重复的数字
    如何通过onenote发送博客到cnblog(博客园)
  • 原文地址:https://www.cnblogs.com/leby/p/4882877.html
Copyright © 2011-2022 走看看