Linux服务器性能评估与优化
一、影响务器性能因素
影响企业生产环境Linux服务器性能的因素有很多,一般分为两大类,分别为操作系统层级和应用程序级别。如下为各级别影响性能的具体项及性能评估的标准:
(1)操作系统级别
-
内存;
-
CPU;
-
磁盘I/O;
-
网络I/O带宽。
(2) 应用程序及软件
-
Nginx;
-
MySQL;
-
Tomcat;
-
PHP;
-
应用程序代码。
(3)Linux系统性能评估标准如表所示:
影响性能因素 |
评判标准 |
||
好 |
坏 |
糟糕 |
|
CPU |
user% + sys%< 70% |
user% + sys%= 85% |
user% + sys% >=90% |
内存 |
Swap In(si)=0 Swap Out(so)=0 |
Per CPU with 10 page/s |
More Swap In & Swap Out |
磁盘 |
iowait % < 20% |
iowait % =35% |
iowait % >= 50% |
(4) Linux系统性能分析工具
常用系统性能分析命令; vmstat、sar、iostat、netstat、free、ps、top、iftop等; 常用系统性能组合分析命令; top、uptime 检查系统整体的负载、承受能力; vmstat、sar、iostat 、top 检测是否是CPU瓶颈; free、vmstat 检测是否是内存瓶颈; iostat 检测是否是磁盘I/O瓶颈; netstat、iftop 检测是否是网络带宽瓶颈。
二、 Linux服务器性能评估与优化
Linux服务器性能评估与优化是一项长期的工作,需要随时关注网站服务器的运行状态,及时作出相应的调整,如下为Linux服务器性能评估及优化方案:
1、Linux系统整体性能评估
uptime命令主要用于查看当前服务器整体性能,例如CPU、负载、内存等值的总览,如下为uptime命令应用案例及详解:
[root@web1 ~]# uptime 13:38:00 up 112 days, 14:01, 5 users, load average: 6.22, 1.02, 0.91
Load average负载有三个值,分别表示:最近1分钟、5分钟、15分钟系统的负载,三个值的大小一般不能大于系统逻辑CPU核数的2倍,例如Linux操作系统有4个逻辑CPU,如果load average的三个值长期大于8时,说明CPU很繁忙,负载很高,可能会影响系统性能,但是偶尔大于8时,可以不用担心,一般不会影响系统性能。
如果load average的输出值小于CPU逻辑个数的2倍,则表示CPU还有空闲的时间片,例如案例中CPU负载为6.22,表示CPU或者服务器是比较空闲的。基于此参数不能完全确认服务器的性能瓶颈,需要借助其他工具进一步判断
2、CPU性能评估
利用vmstat命令监控系统CPU,该命令可以显示关于系统各种资源之间相关性能的简要信息,主要用它来查看CPU负载及队列情况。
如图所示,为vmstat命令在某个系统的输出结果:
Vmstat输出结果详解如下:
r 列表示运行和等待cpu时间片的进程数,这个值如果长期大于系统CPU的个数,说明CPU不足,需要增加CPU; b 列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等; us 列显示了用户进程消耗的CPU 时间百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,就需要考虑优化程序或算法; sy 列显示了内核进程消耗的CPU时间百分比。Sy的值较高时,说明内核消耗的CPU资源很多; us+sy的参考值为80%,如果us+sy大于80%说明可能存在CPU资源不足。
利用sar命令监控系统CPU,sar功能很强大,可以对系统的每个方面进行单独的统计,但是使用sar命令会增加系统开销,不过这些开销是可以评估的,对系统的统计结果不会有很大影响。如图15-7所示,为sar命令对某个系统的CPU统计输出:
Sar输出结果详解如下:
%user 列显示了用户进程消耗的CPU 时间百分比; %nice 列显示了运行正常进程所消耗的CPU 时间百分比; %system 列显示了系统进程消耗的CPU时间百分比; %iowait 列显示了IO等待所占用的CPU时间百分比; %idle 列显示了CPU处在空闲状态的时间百分比; %steal 列显示了在内存相对紧张的环境下page in强制对不同的页面进行的steal操作。
3、内存性能评估
利用free指令监控内存,free是监控linux内存使用状况最常用的指令,如图15-8所示为服务器内存使用情况:
一般而言,服务器内存可以通过如下方法判断是否空余:
应用程序可用内存/系统物理内存>70%时,表示系统内存资源非常充足,不影响系统性能。 应用程序可用内存/系统物理内存<20%时,表示系统内存资源紧缺,需要增加系统内存,20%<应用程序可用内存/系统物理内存<70%时,表示系统内存资源基本能满足应用需求,暂时不影响系统性能。
4、磁盘I/O性能评估
利用iostat评估磁盘性能,监控磁盘IO读写及带宽,如图所示:
iostat输出结果详解如下:
Blk_read/s 表示每秒读取的数据块数; Blk_wrtn/s 表示每秒写入的数据块数; Blk_read 表示读取的所有块数; Blk_wrtn 表示写入的所有块数。
可以通过Blk_read/s和Blk_wrtn/s的值对磁盘的读写性能有一个基本的了解,如果Blk_wrtn/s值很大,表示磁盘的写操作很频繁,可以考虑优化磁盘或者优化程序,如果Blk_read/s值很大,表示磁盘直接读取操作很多,可以将读取的数据放入内存中进行操作。
利用sar评估磁盘性能,通过sar -d组合,可以对系统的磁盘IO做一个基本的统计,如图所示:
Sar输出结果详解如下:
await表示平均每次设备I/O操作的等待时间(以毫秒为单位); svctm表示平均每次设备I/O操作的服务时间(以毫秒为单位); %util表示一秒中有百分之几的时间用于I/O操作;
磁盘IO性能,评判标准:正常情况下svctm应该是小于await值的,而svctm的大小和磁盘性能有关,CPU、内存的负荷也会对svctm值造成影响,过多的请求也会间接的导致svctm值的增加。
await值的大小一般取决与svctm的值和I/O队列长度以及I/O请求模式,如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢,此时可以通过更换更快的硬盘来解决问题。
%util项的值也是衡量磁盘I/O的一个重要指标,如果%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷的在工作,该磁盘可能存在瓶颈。长期下去,势必影响系统的性能,可以通过优化程序或者通过更换更高、更快的磁盘来解决此问题。
5、网络性能评估
-
通过ping命令检测网络的连通性
-
通过netstat –i组合检测网络接口状况
-
通过netstat –r组合检测系统的路由表信息
-
通过sar -n组合显示系统的网络运行状态
通过iftop -i eth0 查看网卡流量,详细参数如下,如图所示:
<= 客户端流入的流量; => 服务器端流出的流量; TX 发送流量; RX 接收流量; TOTAL 总流量; Cumm 运行iftop到目前时间的总流量; peak 流量峰值; rates 分别表示过去 2s 10s 40s 的平均流量。
1. sar -n DEV 1 2
sar命令包含在sysstat工具包中,提供系统的众多统计数据。其在不同的系统上命令有些差异,某些系统提供的sar支持基于网络接口的数据统计,也可以查看设备上每秒收发包的个数和流量。
sar –n DEV 1 2
命令后面1 2 意思是:每一秒钟取1次值,取2次。
DEV显示网络接口信息
另外,-n参数很有用,他有6个不同的开关:DEV | EDEV | NFS | NFSD | SOCK | ALL ,其代表的含义如下:
- DEV显示网络接口信息。
- EDEV显示关于网络错误的统计数据。
- NFS统计活动的NFS客户端的信息。
- NFSD统计NFS服务器的信息
- SOCK显示套接字信息
- ALL显示所有5个开关
[sre@CDVM-213017031 ~]$ sar -n DEV 1 2 Linux 2.6.32-431.el6.x86_64 (CDVM-213017031) 05/04/2017 _x86_64_ (4 CPU) 08:05:30 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 08:05:31 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 08:05:31 PM eth0 1788.00 1923.00 930.47 335.60 0.00 0.00 0.00 08:05:31 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 08:05:32 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 08:05:32 PM eth0 1387.00 1469.00 652.12 256.98 0.00 0.00 0.00 Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: eth0 1587.50 1696.00 791.29 296.29 0.00 0.00 0.00
参数说明:
IFACE:LAN接口 rxpck/s:每秒钟接收的数据包 txpck/s:每秒钟发送的数据包 rxbyt/s:每秒钟接收的字节数 txbyt/s:每秒钟发送的字节数 rxcmp/s:每秒钟接收的压缩数据包 txcmp/s:每秒钟发送的压缩数据包 rxmcst/s:每秒钟接收的多播数据包 rxerr/s:每秒钟接收的坏数据包 txerr/s:每秒钟发送的坏数据包 coll/s:每秒冲突数 rxdrop/s:因为缓冲充满,每秒钟丢弃的已接收数据包数 txdrop/s:因为缓冲充满,每秒钟丢弃的已发送数据包数 txcarr/s:发送数据包时,每秒载波错误数 rxfram/s:每秒接收数据包的帧对齐错误数 rxfifo/s:接收的数据包每秒FIFO过速的错误数 txfifo/s:发送的数据包每秒FIFO过速的错误数
#!/bin/bash ethn=$1 if [ -z $ethn ];then echo "please select Network Interface" exit 0 fi while true do RX_pre=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $2}') TX_pre=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $10}') sleep 1 RX_next=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $2}') TX_next=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $10}') clear echo -e "\t RX `date +%k:%M:%S` TX" RX=$((${RX_next}-${RX_pre})) TX=$((${TX_next}-${TX_pre})) if [[ $RX -lt 1024 ]];then RX="${RX}B/s" elif [[ $RX -gt 1048576 ]];then RX=$(echo $RX | awk '{print $1/1048576 "MB/s"}') else RX=$(echo $RX | awk '{print $1/1024 "KB/s"}') fi if [[ $TX -lt 1024 ]];then TX="${TX}B/s" elif [[ $TX -gt 1048576 ]];then TX=$(echo $TX | awk '{print $1/1048576 "MB/s"}') else TX=$(echo $TX | awk '{print $1/1024 "KB/s"}') fi echo -e "$ethn \t $RX $TX " done
参考:https://www.cnblogs.com/nmap/p/9427260.html