Linux之系统性能优化

丈夫欲遂平生志,一载寒窗一举汤。这篇文章主要讲述Linux之系统性能优化相关的知识,希望能为你提供帮助。

目录

  • 1.内存使用率
    • 1.1 物理内存使用率高
    • 1.2 虚拟内存使用高
    • 1.3 找出消耗内存的元凶
      • 1.3.1 使用top查看物理内存占用
      • 1.3.2 循环查询虚拟内存占用
  • 2.CPU使用率
    • 2.1 CPU使用率高但负载低
    • 2.2 CPU使用率高负载也高
  • 3.系统负载高
    • 3.1 使用uptime查看负载
    • 3.2 使用top查看负载
    • 3.3 定位负载高的原因

如果你是操作系统管理员、中间件管理员、数据库管理员或者开发人员,肯定有机会遇到系统运行缓慢相关的问题。
1.内存使用率 1.1 物理内存使用率高 这个其实是好多linux初学者最开始遇到的问题,刚申请的服务器,还没跑程序就发现物理内存使用率很高,少则80%,90%,有些甚至接近100%。其实,我们是用windows的使用经验就判断linux,当面对物理内存使用率高的时候,才会恐慌。其实,只要物理内存可用不为0,swap几乎还没开始使用,就是安全的。
Mem这一行代表物理内存的使用情况,看available就知道还有多少物理内存空闲。 [robin@instance-2 ~]$ free -m totalusedfreesharedbuff/cacheavailable Mem:352932714208017802863 Swap:000 [robin@instance-2 ~]$ free -g totalusedfreesharedbuff/cacheavailable Mem:301012 Swap:000

1.2 虚拟内存使用高 大家都知道,虚拟内存是使用硬盘作为内存的一种方式,性能想比较物理内存,差很多。所以当swap开始大于零的时候,就要去考虑增大内存,或者去查找程序本身的错误了。
Swap这一行代表虚拟内存的使用情况,看used这个值,就知道已经使用了都少swap内存。 [robin@instance-2 ~]$ free -m totalusedfreesharedbuff/cacheavailable Mem:352932714208017802863 Swap:000 [robin@instance-2 ~]$ free -g totalusedfreesharedbuff/cacheavailable Mem:301012 Swap:000

1.3 找出消耗内存的元凶 当某一天你发现,LInux操作系统的内存严重不足,已经开始大量使用 Swap,甚至都用了多少G的Swap内存。
1.3.1 使用top查看物理内存占用
使用top命令,并且CTRL+M就会按照内存的使用率给进程排序。 top - 00:10:46 up 8 days,1:39,2 users,load average: 0.00, 0.01, 0.05 Tasks: 162 total,1 running, 161 sleeping,0 stopped,0 zombie %Cpu(s):0.1 us,0.2 sy,0.0 ni, 99.8 id,0.0 wa,0.0 hi,0.0 si,0.0 st KiB Mem :3756148 total,2305048 free,1037268 used,413832 buff/cache KiB Swap:3932156 total,3932156 free,0 used.2439208 avail MemPID USERPRNIVIRTRESSHR S%CPU %MEMTIME+ COMMAND 4956 jenkins200 4657416 78326822980 S0.3 20.929:19.30 java 4796 mysql200978712942687028 S0.32.516:59.70 mysqld

1.3.2 循环查询虚拟内存占用
第一列为PID,第二列为这个进程占用的虚拟内存 [root@localhost ~]# for i in $( cd /proc; ls |grep "^[0-9]"|awk \' $0 > 100\') ; do awk \'/Swap:/{a=a+$2}END{print \'"$i"\',a/1024"M"}\' /proc/$i/smaps 2> /dev/null ; done | sort -k2nr | head -10 112 0M 1149 0M 1155 0M 1169 0M 1172 0M 1184 0M 1187 0M 1191 0M 1198 0M 1210 0M

2.CPU使用率 其实,总结来讲判断目前的CPU运算时间够不够用,主要看内存的使用率和系统负载,只要系统负载不高,一般都很安全。
2.1 CPU使用率高但负载低 这种情况说明,目前CPU资源较为紧张,但是不是性能的瓶颈,CPU基本满足要求。我们一般看负载,只要负载是CPU核心数的0.75倍,就很安全。第一行的load average: 0.00, 0.01, 0.05就代表最近5分钟、10分钟、15分钟的平均负载,第三行的%Cpu(s)代表整体的CPU使用率。
使用top的时候,默认情况下,看到第三行的CPU使用率,那是一个整体的CPU使用率。 top - 00:17:55 up 8 days,1:46,2 users,load average: 0.00, 0.01, 0.05 Tasks: 161 total,1 running, 160 sleeping,0 stopped,0 zombie %Cpu(s):0.2 us,0.2 sy,0.0 ni, 99.6 id,0.0 wa,0.0 hi,0.0 si,0.0 st KiB Mem :3756148 total,2304972 free,1037344 used,413832 buff/cache KiB Swap:3932156 total,3932156 free,0 used.2439132 avail MemPID USERPRNIVIRTRESSHR S%CPU %MEMTIME+ COMMAND 25965 root20016202423801600 R1.70.10:01.42 top 5302 robin20014997221281600 S0.80.112:36.84 ping使用top的时候,如果还想查看单个CPU的使用情况,输入1就可以了。 top - 00:19:22 up 8 days,1:48,2 users,load average: 0.17, 0.06, 0.06 Tasks: 162 total,1 running, 161 sleeping,0 stopped,0 zombie %Cpu0:0.0 us,0.0 sy,0.0 ni,100.0 id,0.0 wa,0.0 hi,0.0 si,0.0 st %Cpu1:0.0 us,1.5 sy,0.0 ni, 98.5 id,0.0 wa,0.0 hi,0.0 si,0.0 st %Cpu2:0.0 us,0.0 sy,0.0 ni,100.0 id,0.0 wa,0.0 hi,0.0 si,0.0 st %Cpu3:0.0 us,0.0 sy,0.0 ni,100.0 id,0.0 wa,0.0 hi,0.0 si,0.0 st KiB Mem :3756148 total,2304932 free,1037384 used,413832 buff/cache KiB Swap:3932156 total,3932156 free,0 used.2439092 avail MemPID USERPRNIVIRTRESSHR S%CPU %MEMTIME+ COMMAND 25967 root20016202423801600 R1.50.10:00.03 top 1 root20019097639882620 S0.00.11:11.02 systemd 2 root200000 S0.00.00:00.19 kthreadd

2.2 CPU使用率高负载也高 这种情况说明,目前CPU资源紧张,而且已经造成了系统缓慢,一般负载大于CPU核心数的0.75倍,我们就认为负载也高了。这个时候,就要查查CPU都是被谁占用了,而且可能还伴随着IO或者其他访问的问题。
3.系统负载高 系统负载的概念,在Linux系统管理方面非常实用,通过平均负载值就可以快速判断当前系统的安全状况。
3.1 使用uptime查看负载
其实,uptime不仅能查看系统开机多久了,而且也能查看系统在5min 10min 15min的平均负载情况。 [root@localhost ~]# uptime 00:23:41 up 8 days,1:52,2 users,load average: 0.00, 0.03, 0.05 [root@localhost ~]#

3.2 使用top查看负载
top是我认为的linux系统最好的性能优化命令或者工具,第一行load average: 0.00, 0.02, 0.05就是值最近5min 10min 15min的平均负载。 [root@localhost ~]# top top - 00:24:38 up 8 days,1:53,2 users,load average: 0.00, 0.02, 0.05 Tasks: 162 total,1 running, 161 sleeping,0 stopped,0 zombie %Cpu(s):1.4 us,2.9 sy,0.0 ni, 95.7 id,0.0 wa,0.0 hi,0.0 si,0.0 st KiB Mem :3756148 total,2304984 free,1037212 used,413952 buff/cache KiB Swap:3932156 total,3932156 free,0 used.2439168 avail Mem

3.3 定位负载高的原因 先使用top命令查看整体的负载情况。
top - 00:13:53 up 12 min,2 users,load average: 0.00, 0.11, 0.13 Tasks: 170 total,1 running, 169 sleeping,0 stopped,0 zombie %Cpu0:0.0 us,0.0 sy,0.0 ni,100.0 id,0.0 wa,0.0 hi,0.0 si,0.0 st %Cpu1:0.0 us,0.3 sy,0.0 ni, 99.7 id,0.0 wa,0.0 hi,0.0 si,0.0 st %Cpu2:0.0 us,0.3 sy,0.0 ni, 99.7 id,0.0 wa,0.0 hi,0.0 si,0.0 st %Cpu3:0.0 us,0.0 sy,0.0 ni,100.0 id,0.0 wa,0.0 hi,0.0 si,0.0 st KiB Mem :3756132 total,1771392 free,1026936 used,957804 buff/cache KiB Swap:3932156 total,3932156 free,0 used.2467352 avail Mem

第一行的load average后面的三个数值分别代表最近1分钟、5分钟、15分钟的负载数据。
第二行显示不同类型的task,其中zombie也就是传说的僵尸进程,如果存在可能会严重影响整体性能。
第三行到第6行,显示每个cpu的使用情况,us代表用户占用CPU百分比,sy代表内核占用CPU百分比,id代表空闲CPU百分比,wa代表IO等待占用的CPU百分比,wa如果超过了30要高度注意了,可能瓶颈在磁盘I/O
再用vmstat命令查看更加全面的性能指标。
[root@localhost ~]# vmstat 3 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- rbswpdfreebuffcachesisobiboincs us sy id wa st 000 17718722132 9559680068848111920 9800

【Linux之系统性能优化】r表示运行队列(就是说多少个进程真的分配到CPU),一般不能超过CPU数量。
b表示堵塞的进程数量,只要大于0了,就会影响性能。
swpd 表示虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了。
free表示物理内存还有多少空闲。
cache直接用来记忆我们打开的文件,给文件做缓冲。
si代表每秒从磁盘读入虚拟内存的大小,只要大于0就说明内存不足了。
so代表每秒虚拟内存写入磁盘的大小,只要大于0就说明内存不足了。
bi/bo代表块设备每秒接收和发送的块数据。
in 代表每秒CPU的中断次数,包括时间中断。
cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id 空闲 CPU时间。
wt 等待IO CPU时间,一般来说,id + us + sy+ wa = 100。

    推荐阅读