Linux之系统性能优化
Posted lihuanhuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux之系统性能优化相关的知识,希望对你有一定的参考价值。
目录
如果你是操作系统管理员、中间件管理员、数据库管理员或者开发人员,肯定有机会遇到系统运行缓慢相关的问题。
1.内存使用率1.1 物理内存使用率高
这个其实是好多linux初学者最开始遇到的问题,刚申请的服务器,还没跑程序就发现物理内存使用率很高,少则80%,90%,有些甚至接近100%。其实,我们是用windows的使用经验就判断linux,当面对物理内存使用率高的时候,才会恐慌。其实,只要物理内存可用不为0,swap几乎还没开始使用,就是安全的。
Mem这一行代表物理内存的使用情况,看available就知道还有多少物理内存空闲。
[robin@instance-2 ~]$ free -m
total used free shared buff/cache available
Mem: 3529 327 1420 80 1780 2863
Swap: 0 0 0
[robin@instance-2 ~]$ free -g
total used free shared buff/cache available
Mem: 3 0 1 0 1 2
Swap: 0 0 0
1.2 虚拟内存使用高
大家都知道,虚拟内存是使用硬盘作为内存的一种方式,性能想比较物理内存,差很多。所以当swap开始大于零的时候,就要去考虑增大内存,或者去查找程序本身的错误了。
Swap这一行代表虚拟内存的使用情况,看used这个值,就知道已经使用了都少swap内存。
[robin@instance-2 ~]$ free -m
total used free shared buff/cache available
Mem: 3529 327 1420 80 1780 2863
Swap: 0 0 0
[robin@instance-2 ~]$ free -g
total used free shared buff/cache available
Mem: 3 0 1 0 1 2
Swap: 0 0 0
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 Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4956 jenkins 20 0 4657416 783268 22980 S 0.3 20.9 29:19.30 java
4796 mysql 20 0 978712 94268 7028 S 0.3 2.5 16: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 Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
25965 root 20 0 162024 2380 1600 R 1.7 0.1 0:01.42 top
5302 robin 20 0 149972 2128 1600 S 0.8 0.1 12: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 Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
25967 root 20 0 162024 2380 1600 R 1.5 0.1 0:00.03 top
1 root 20 0 190976 3988 2620 S 0.0 0.1 1:11.02 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0: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-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 1771872 2132 955968 0 0 68 84 81 119 2 0 98 0 0
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。
以上是关于Linux之系统性能优化的主要内容,如果未能解决你的问题,请参考以下文章