欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux服务器性能(一)-CPU

程序员文章站 2022-05-15 21:51:02
...

转载自:https://blog.csdn.net/hguisu/article/details/39373311

  

1、前言简介

Linux性能评估与优化:cpu,内存,IO, 网络

1.1、系统性能分析工具

Linux服务器性能(一)-CPU

1.常用系统命令
vmstat、sar、iostat、netstat、free、ps、top等

2.常用组合方式

  • 用vmstat、sar、iostat检测是否是CPU瓶颈
  • 用free、vmstat检测是否是内存瓶颈
  • 用iostat检测是否是磁盘I/O瓶颈
  • 用netstat检测是否是网络带宽瓶颈(netstat -nat | awk 'FNR>2{print $NF}' | sort | uniq -c) netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

1.2、系统工具图:

Linux服务器性能(一)-CPU

  

2、负载:整体性能评估

2.1系统整体性能评估(uptime/top)

  • uptime
16:38:00 up 118 days,  3:01,  5 users,  load average: 1.22, 1.02, 0.91

这里需要注意的是:load average这个输出值,这三个值的大小一般不能大于系统CPU的个数,例如,本输出中系统有8个CPU,如果load average的三个值长期大于8时,说明CPU很繁忙,负载很高,可能会影响系统性能,但是偶尔大于8时,倒不用担心,一般不会影响系统性能。相反,如果load average的输出值小于CPU的个数,则表示CPU还有空闲的时间片,比如本例中的输出,CPU是非常空闲的。

  • top
    系统负载指运行队列的平均长度,也就是等待CPU的平均进程数。Load越高说明系统响应越慢,如果load是0,代表进程不需要等待,立刻就能获得cpu运行。可以通过查询文件/proc/loadavg获取系统在前一分钟、前五分钟和前十五分钟的平均负载以及当前运行的进程、系统的进程数和上一次调度运行的进程。
    top显示中,RES:进程占用的物理内存大小,VIRT:物理内存+虚拟内存。

  • sar
    利用sar命令监控系统CPU,sar功能很强大,可以对系统的每个方面进行单独的统计,但是使用sar命令会增加系统开销,不过这些开销是可以评估的,对系统的统计结果不会有很大影响。


什么场景会造成负载很高但CPU低?
  负载总结为一句话就是:需要运行处理但又必须等待队列前的进程处理完成的进程个数。具体来说,也就是如下两种情况:
  1)等待被授权予CPU运行权限的进程
  2)等待磁盘I/O完成的进程

  ps -eLf可以查看系统的线程。cpu低而负载高也就是说等待磁盘I/O完成的进程过多,就会导致队列长度过大,这样就体现到负载过大了,但实际是此时cpu被分配去执行别的任务或空闲,通过以下命令查看:

1、IOWAIT:通过top命令查看CPU等待IO时间,即%wa;
2、磁盘IO: 通过iostat -d -x -m 1 10查看磁盘IO情况;
3、网络IO:通过sar -n DEV 1 10查看网络IO情况;

通过如下命令查找占用IO的程:
ps -e -L h o state,cmd | awk ‘{if($1==“R”||$1==“D”){print $0}}’ | sort | uniq -c | sort -k 1nr

具体场景有如下几种:

  • 场景1:内存耗尽,如果没有开启swap内存,也将会导致负载特别高,cpu使用很低。
  • 场景2:磁盘读写请求过多就会导致大量I/O等待。cpu的工作效率要高于磁盘,而进程在cpu上面运行需要访问磁盘文件,这个时候cpu会向内核发起调用文件的请求,让内核去磁盘取文件,这个时候会切换到其他进程或者空闲,这个任务就会转换为不可中断睡眠状态。当这种读写请求过多就会导致不可中断睡眠状态的进程过多,从而导致负载高,cpu低的情况。
  • 场景3:MySQL中存在没有索引的语句或存在死锁等情况。我们都知道MySQL的数据是存储在硬盘中,如果需要进行sql查询,需要先把数据从磁盘加载到内存中。当在数据特别大的时候,如果执行的sql语句没有索引,就会造成扫描表的行数过大导致I/O阻塞,或者是语句中存在死锁,也会造成I/O阻塞,从而导致不可中断睡眠进程过多,导致负载过大。具体解决方法可以在MySQL中运行show full processlist命令查看线程等待情况,把其中的语句拿出来进行优化。
  • 场景4:外接硬盘故障,常见有挂了NFS,但是NFS server故障。比如我们的系统挂载了外接硬盘如NFS共享存储,经常会有大量的读写请求去访问NFS存储的文件,如果这个时候NFS Server故障,那么就会导致进程读写请求一直获取不到资源,从而进程一直是不可中断状态,造成负载很高。
  • 场景5:访问第三方api接口。如果我们访问第三方http api,例如接口的响应时间很慢,readTimeout=2000ms,在高并发的情况下,很多线程都被中断等待api的网络IO。导致cpu使用率很低,但是load很高。
  • 场景6:系统出现大量的僵死进程。ps -aux | grep D | grep df,出现此种情况时,可能是由于僵死进程导致的。可以通过指令 ps -axjf 查看是否存在 D 状态进程。D 状态是指不可中断的睡眠状态。该状态的进程无法被 kill,也无法自行退出。只能通过恢复其依赖的资源或者重启系统来解决。
相关标签: Linux相关