Linux 系统优化
本文档系统讲解 Linux 上线前的系统优化与运行时性能调优,涵盖磁盘分区与 swap 规划、服务与网络初始化、yum 与文件系统选型,以及 CPU、内存、IO、网络四大子系统的监测命令、瓶颈判定与内核参数调整。服务优化以 nginx/tomcat/mysql/oracle 等为背景,核心思路是先识别瓶颈再做微调。
一、优化思路
系统性能优化可从两个方向扩展:
- 横向扩展:增加新的设备,做架构级扩展。
- 纵向扩展:替换更好的设备,提升单机负载能力。
调优层面:加硬件、架构调整、云(资源流动性)。判断系统状态最直观的指标就是 CPU 忙还是闲。Linux 系统优化属于"微调",主要围绕 CPU、memory、IO、network、service 展开。
二、业务上线之前的优化
2.1 安装系统时的分区规划
以教学环境 500G 硬盘为例:
| 分区 | 建议大小 | 说明 |
|---|---|---|
/boot |
300M–500M | 只存放 grub 和启动相关文件 |
/ |
100G–150G | 未单独挂载的分区都属于根 |
| swap | 内存小分 2 倍;内存大(16G 以上)最大 4G 或 8G | 交换分区 |
/var |
50G–100G | 日志、邮件、ftp、httpd 家目录、kvm 磁盘文件等 |
/vm |
50G–100G | vmware 虚拟机 |
/data |
50G–100G | 个人数据 |
可留一点空间用于以后分区。系统出严重问题时,重装只格式化根分区,重装完改写 /etc/fstab。
根分区满了怎么办:LVM 可在线扩容;没用 LVM 只能把根下数据移到其它分区;btrfs 可在线扩容;xfs 可用 xfs_growfs 扩容。
2.2 软件包选择
需要啥就安装啥。在意系统瘦身就最小化安装,再按需补装。
2.3 swap 的两种做法
swap 有 swap 文件和 swap 分区两种,swap 分区更有效,建议使用。
通过文件增加交换分区:
# dd if=/dev/zero of=$home/swapfile bs=1M count=1000
# mkswap $home/swapfile
# swapon $home/swapfile
# swapoff $home/swapfile # swapon 的反向操作
通过磁盘分区增加交换分区:
- 为虚拟机添加磁盘。
- 启动后在
/dev下ls /dev/sd*,原来只有一块盘会看到/dev/sdb。 fdisk /dev/sdb分区。
# mkswap /dev/sdaX # 格式化为交换分区
# swapon /dev/sdaX # 生效
# free -m # 查看大小
# swapoff /dev/sdaX # 关闭
2.4 关闭不用的服务
# service xxx stop
# systemctl stop xxx
# chkconfig xxx off
# systemctl disable xxx
# ntsysv --level 2345
注意:haldaemon、messagebus 关闭任意一个会造成开机鼠标键盘无法用(RHEL6 经验,RHEL7 无 haldaemon)。常见不关闭的服务:network、sshd、rsyslog、libvirtd、ntpd 等。没有服务脚本的可写脚本;脚本写得不好可修改代码。
2.5 静态 IP、网关、DNS
先关闭 NetworkManager:
# systemctl stop NetworkManager
# chkconfig NetworkManager off
以 server.example.com,IP 192.168.224.10 为例,编辑 /etc/sysconfig/network-scripts/ifcfg-ens33:
TYPE="Ethernet"
BOOTPROTO=none
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="17883cd1-86c8-4ec3-b254-5ce6d462e929"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.224.10
PREFIX=24
GATEWAY=192.168.224.2
DNS1=192.168.224.2
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
RHEL7 的 nmcli 命令非常强大,几乎能控制所有网络相关修改。
2.6 主机名配置和绑定
- 域名:公网名字,花钱买,唯一。
- 主机名:内网名字。
批量绑定主机名的方法:
- 方法一:shell 脚本,先在一台绑定所有 IP 与名字到
/etc/hosts,再循环拷到其它机器(ssh 等效性或 expect)。 - 方法二:kickstart/cobbler 安装时通过 postscripts 统一设置 IP、主机名、绑定。不适合主机名会改变的情况。
- 方法三:内网 DNS。
/etc/nsswitch.conf配置先查/etc/hosts再查 DNS。 - 方法四:自动化运维工具 puppet、ansible、saltstack 等。
2.7 yum 配置
yum 只能装 rpm 包,不能装源码包(可自制 rpm 包)。建议用一台服务器把本地 iso 和第三方 rpm 包做成 yum 仓库,其它机器直接用。yum 路径要写 repodata 的上一级目录。
RHEL6 完整本地 yum 源(iso 挂载到 /mnt):
[base]
name=base
baseurl=file:///mnt/
enabled=1
gpgcheck=0
[server]
name=server
baseurl=file:///mnt/Server
enabled=1
gpgcheck=0
[ResilientStorage]
name=ResilientStorage
baseurl=file:///mnt/ResilientStorage
enabled=1
gpgcheck=0
[ScalableFileSystem]
name=ScalableFileSystem
baseurl=file:///mnt/ScalableFileSystem
enabled=1
gpgcheck=0
[HighAvailability]
name=HighAvailability
baseurl=file:///mnt/HighAvailability
enabled=1
gpgcheck=0
[LoadBalancer]
name=LoadBalancer
baseurl=file:///mnt/LoadBalancer
enabled=1
gpgcheck=0
下载远程公网 yum 源到本地:
a. 配置远程源:
[puppet]
name=puppet
baseurl=http://yum.puppetlabs.com/el/6.5/products/x86_64/
enabled=1
gpgcheck=0
b. 用 reposync 下载到当前目录:
reposync --repoid=puppet
c. 下载后没有 repodata,手动生成:
createrepo $(本地软件仓库路径)
d. 通过 httpd 等服务做成其它服务器可用的 yum 源。
2.8 文件系统
分类:单机/集群式/分布式文件系统;非日志/日志文件系统。常见:ext2、ext3、ext4、fat32、ntfs、xfs、reiserfs、zfs、btrfs、jfs、nfs、gfs2、ocfs 等。
ext4 三种数据日志记录方式:
| 模式 | 速度 | 安全性 | 说明 |
|---|---|---|---|
data=writeback |
最快 | 低 | 不记录文件系统日志,只记录基本元数据 |
data=journal |
最慢 | 高 | 记录完整文件系统日志 |
data=ordered |
居中 | 居中 | 默认 |
mount 时用 -o data=writeback,或在 /etc/fstab 写 defaults,data=writeback。
速度对比实验:
mount -o defaults,data=writeback /dev/sdb1 /mnt/
dd if=/dev/zero of=/mnt/testfile bs=1M count=1000 # 最快
umount /mnt
mount -o defaults,data=journal /dev/sdb1 /mnt
dd if=/dev/zero of=/mnt/testfile bs=1M count=1000 # 最慢
umount /mnt
mount -o defaults,data=ordered /dev/sdb1 /mnt
dd if=/dev/zero of=/mnt/testfile bs=1M count=1000 # 居中
文件系统修复实验:
# 模拟丢失 superblock:在 /dev/sdb1 第 1024 位置写入 1024 字节
# dd if=/dev/zero of=/dev/sdb1 bs=1 count=1024 seek=1024
# 挂载会报错:
# mount /dev/sdb1 /mnt/
mount: you must specify the filesystem type
# 不能直接格式化(数据全丢),用 fsck 修复:
# fsck /dev/sdb1
# mount /dev/sdb1 /mnt/ # 成功加载
三、CPU 子系统
CPU 占用取决于什么资源在上面运行。拷贝文件占用较少 CPU(完成后给中断通知);科学计算占用较多 CPU(大部分计算在 CPU 完成,内存硬盘只做暂时存储)。监测 CPU 需了解中断、进程调度、上下文切换、可运行队列等。单核同一时间点只能干一件事,跑多任务靠分时间片。
CPU 很无辜,是个任劳任怨的打工仔,每时每刻都有工作在做(进程、线程),并且有一张工作清单(可运行队列),由老板(进程调度)决定该干什么,需要和老板沟通以调整工作(上下文切换),部分工作做完后向老板汇报(中断)。所以 CPU 除了做自己该做的工作,还有大量时间和精力花在沟通和汇报上。
3.1 基本概念
| 概念 | 说明 |
|---|---|
| 中断 | 设备通知内核完成了一次数据处理;CPU 停下来执行别的指令,如完成一次 IO 或网络包发送 |
| 内核处理过程 | 控制优先级,进行任务调度 |
| 上下文切换 | 把正在占用 CPU 的进程放回队列;每次切换资源被用于关闭 CPU 寄存器中的线程并放入队列 |
| 运行队列 | 等待 CPU 处理的进程队列 |
3.2 CPU 性能底线
- CPU 利用率 100% 时应平衡:65%–70% User Time,30%–35% System Time,0%–5% Idle Time。
- 上下文切换要和 CPU 利用率联系看,保持上述平衡时大量切换可接受。
3.3 查看 CPU 信息
# cat /proc/cpuinfo # 指令集、核数、频率、缓存等
# lscpu
采集命令/软件:top、uptime、vmstat、mpstat(需 yum install sysstat)、nagios、zabbix。
3.4 vmstat
# vmstat 2 # 每 2 秒采集
# vmstat 2 3 # 每 2 秒采集一次,共 3 次
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 78112 63432 1519100 0 0 233 18 1906 1190 26 13 59 1 0
1 0 0 78112 63432 1519100 0 0 0 0 4180 1378 33 17 50 0 0
1 0 0 78112 63440 1519092 0 0 0 30 4284 1706 33 17 50 0 0
| 字段 | 含义 |
|---|---|
r |
可运行队列。单核不应超过 3(经验值,大于此值表明队列偏长) |
b |
被阻塞进程,等待外部资源。>3 需注意,一直出现更值得注意 |
in |
中断数,大量设备操作成功通知内核 |
cs |
上下文切换,数字高说明内核在调度,不能简单判断瓶颈 |
us |
用户进程占用 CPU 时间百分比 |
sy |
内核任务调度占用 CPU 时间百分比 |
id |
CPU 空闲百分比,为 0 不能简单判断瓶颈,只能说被充分利用 |
wa |
等待 IO 消耗时间百分比 |
st |
被硬件虚拟化虚拟机消耗的时间百分比 |
3.5 mpstat
mpstat 和 vmstat 类似,但可输出多个处理器的数据:
# mpstat -P ALL 1 # 查看所有 CPU 核,每秒一次
10:46:35 AM CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
10:46:36 AM all 26.13 0.00 6.53 0.00 3.52 9.05 0.00 54.77 19478.22
10:46:36 AM 0 25.74 0.00 6.93 0.00 2.97 7.92 0.00 56.44 9740.59
10:46:36 AM 1 26.73 0.00 6.93 0.00 3.96 10.89 0.00 51.49 9739.60
3.6 sar
sysstat 提供 sar(system activity reporter)。特点:可分析过去时间的系统状态,但不能深入分析某个进程,只能分析整体。
# yum install sysstat -y
# systemctl start sysstat
# systemctl enable sysstat
安装后自动在 /var/log/sa/saxx 产生数据(xx 为日期),用 sar -f 读取。
# sar -u # 查看 CPU 历史数据(每十分钟采集一次)
# sar -u 2 3 # 两秒一次,显示三次(当前动态数据)
# sar -u -f /var/log/sa/sa18 # 查看本月 18 号 CPU 历史数据
# sar -u -f /var/log/sa/sa18 -s 09:00:00 -e 10:00:00 # 指定 9 点到 10 点
保存性能数据,支持文本和二进制两种格式:
# 文本文件,可直接 cat
sar -p 1 5 > /tmp/sar1.txt
# 二进制文件,只能用 sar -f 读取
sar -p 1 5 -o /tmp/sar2.txt 1>/dev/null
file /tmp/sar2.txt # data 类型
sar -f /tmp/sar2.txt # 读取
现在架构 CPU 极少成为瓶颈。真成瓶颈时能做的优化很少:换硬件、扩展架构分担压力、杀掉无用且占用资源的进程。
3.7 进程优先级
nice 优先级范围 -20 到 19,-20 最高,19 最低。用户运行程序默认优先级为 0。优先级高的优先分配资源,负载越高效果越明显。renice 对已运行进程调整 nice 值。
测试脚本 /tmp/1.sh:
#!/bin/bash
a=1
sum=0
while true
do
sum=$[$sum+$a]
let a++
done
# bash /tmp/1.sh & # 执行 5-10 遍
# top # 观察各进程优先级
# renice 19 <pid> # 设置低优先级,CPU 使用率降低
# renice -19 8024 # 设置高优先级,CPU 使用率升高
8024 (process ID) old priority 19, new priority -19
注意:只有管理员能把优先级往高调;普通用户只能调自己的,且只能往低调,调低后不能再调高。
四、内存子系统
同步与异步:
client -- squid -- web
web程序 -- memcache/redis -- mysql
CPU(进程) --- 内存(swap) --- 磁盘 (异步)
内存优点:速度非常快的存储介质。缺点:相对磁盘价格贵、存储空间小、数据不能永久存放。
内存包括物理内存和虚拟内存(swap)。虚拟内存把计算机内存空间扩展到硬盘,物理内存(RAM)和硬盘一部分空间(SWAP)组合在一起作为虚拟内存,提供连贯的虚拟内存空间。好处是内存"变多了",可运行更多更大程序;坏处是把部分硬盘当内存用,整体性能受影响,硬盘读写比内存慢几个数量级,且 RAM 和 SWAP 之间的交换增加了系统负担。
虚拟内存把内存上暂时用不到但又不能不用的数据临时保存到磁盘 swap(或虚拟内存文件)中;物理内存不够用时也会使用 swap。需要这些数据时重新从磁盘读取到内存,由内核 kswapd 进程完成。
# ps -ef | grep kswapd
root 41 2 0 18:23 ? 00:00:00 [kswapd0]
root 7251 7181 0 21:35 pts/1 00:00:00 grep --color=auto kswapd
4.1 free 命令
RHEL6 下:
# free
total used free shared buffers cached
Mem: 3801928 3656892 145036 0 88336 2898552
-/+ buffers/cache: 670004 3131924
Swap: 4194296 796 4194296
Linux 的内存使用和 Windows 不一样:Windows 使用过的内存在程序关闭后会释放;Linux 使用过的内存,程序关闭也不释放,而是缓存(buffer+cached)。
注意:生产环境不要使用下面的命令,它会扔掉内存中的缓存:
echo 3 > /proc/sys/vm/drop_caches
RHEL7 下:
# free
total used free shared buff/cache available
Mem: 7974908 528748 6898624 142192 547536 7027592
Swap: 4095996 0 4095996
4.2 内存页与页面故障
内存页(page)默认 4K 大小,是操作内存数据的最小基本单位(类似文件系统里的 block)。
内存分页(paging):内核经常扫描内存,如果发现空闲空间低于某个值,就会把内存上的数据同步到硬盘。这些一般是曾经打开过的文件,数据加载到内存后被修改过。
# yum -y install mariadb
# systemctl start mariadb
# /usr/bin/time -v mysql # 倒数第二行有内存页大小
MariaDB [(none)]> exit
......
Page size (bytes): 4096
Exit status: 1
# /usr/bin/time -v date
...
Major (requiring I/O) page faults: 0 # 主要页面故障
Minor (reclaiming a frame) page faults: 204 # 次要页面故障
...
Page size (bytes): 4096
- 主要页面故障(Major page fault):类似缓存未命中 miss。进程执行时需要读取某些数据,而这些数据在 cache、buffer(内存中)找不到,会产生一次主要页面故障。
- 次要页面故障(Minor page fault):类似缓存命中 hit。进程执行时需要的数据在内存中可以找到。
系统为提高访问效率,总是把数据缓存起来以便在内存中直接操作,减少磁盘读写。其实就是尽可能减少主要页面故障、增加次要页面故障的过程。
小实例测试:
/usr/bin/time -v firefox # 运行两次,第二次主要页面故障为 0,打开速度变快
执行 echo 3 > /proc/sys/vm/drop_caches 扔掉缓存后,再用 /usr/bin/time -v firefox 执行,主要页面故障又不为 0,且明显感觉变慢,说明缓存没有命中。
4.3 内存工作原理总结
- CPU 速度快、磁盘速度慢,CPU 运算需要从磁盘取数据,中间加内存做缓存可提高性能。
- 内存包括物理内存和虚拟内存(swap)。
- CPU 取数据先找内存,能找到(内存 hit)直接给 CPU,效率高;没找到(内存 miss)则找磁盘,效率低。
- 从磁盘取的数据会先放到内存缓存,以便下次 hit;内存空间不够时,新数据会挤掉最近最少使用 LRU(least recently used)的数据。
- 内核在物理内存不够时使用虚拟内存;物理内存有空闲时也可能使用虚拟内存(用 LRU 把最近不常用的换出),即物理内存够不够都可能用 swap,由内核控制。
- 物理内存与虚拟内存交换的单位是内存页,大小 4096 字节。
- Linux 会把访问过的程序或文件都缓存起来,程序关闭也不释放相关缓存。
- 内存里被 CPU 处理过的数据(脏数据 dirty data,最终要写回磁盘)会在满足特定条件时由
pdflush进程写到磁盘,这些条件可通过修改内核参数优化。
4.4 查看内存状态
命令:free、top、vmstat、sar。
vmstat 中 free、buff、cache 对应 free 命令的 free、buffers、cached:
| 字段 | 含义 |
|---|---|
si |
有多少数据从 swap 到物理内存 |
so |
有多少数据从物理内存到 swap |
bi |
有多少数据从块设备读取到内存 |
bo |
有多少数据从内存写到块设备 |
# sar -B 2 3
Linux 2.6.32-279.el6.x86_64 (li.cluster.com) 04/25/2014 _x86_64_ (2 CPU)
11:28:53 AM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
11:28:55 AM 0.00 0.00 45.23 0.00 368.34 0.00 0.00 0.00 0.00
11:28:57 AM 0.00 19.90 78.11 0.00 533.33 0.00 0.00 0.00 0.00
11:28:59 AM 0.00 0.00 46.50 0.00 177.50 0.00 0.00 0.00 0.00
Average: 0.00 6.67 56.67 0.00 360.00 0.00 0.00 0.00 0.00
| 字段 | 含义 |
|---|---|
pgpgin/s |
每秒从磁盘 page in 内存的 KB |
pgpgout/s |
每秒从内存 page out 磁盘的 KB |
fault/s |
每秒的(major+minor)page faults 之和 |
majflt/s |
每秒的 major page faults 数 |
如果 pgpgin 和 pgpgout 很多,majflt/fault 内存 miss 率很高,且系统运行程序固定,可能说明内存不够用,缓存不了所有数据,命中率低。
4.5 如何判断内存不够
结合 free、vmstat、sar 综合分析:
vmstat看到swpd使用较多,free+buff+cache很小,且si、so频繁,说明可用内存小、swap 使用多、交互频繁,内存遇瓶颈。sar -B看到pgpgin/s和pgpgout/s频繁,说明内存和磁盘交互频繁;majflt/s / fault/s内存 MISS 率变高,pgfree/s可用内存列表变小,也说明内存不够。
五、内核参数基本操作
# sysctl -a # 查看当前所有内核参数及其值
内核参数配置文件 /etc/sysctl.conf,修改保存后 sysctl -p 生效。
参数与 /proc 路径对应关系:
# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
# 对应 /proc/sys/net/ipv4/ip_forward
# sysctl -a | grep file-max
fs.file-max = 381908
# 对应 /proc/sys/fs/file-max
临时修改(重启后不生效):
# echo 1 > /proc/sys/net/ipv4/ip_forward
# sysctl -w net.ipv4.ip_forward=1
永久生效:修改 /etc/sysctl.conf:
net.ipv4.ip_forward = 1
保存后执行:
# sysctl -p
5.1 与内存和 swap 有关的内核参数
vm.swappiness:表示使用 swap 分区的程度。0 表示尽可能使用物理内存,100 表示积极使用 swap。
# cat /proc/sys/vm/swappiness
60
调优规则:物理内存够大就尽量不用 swap,可调小如 swappiness=10。
vm.min_free_kbytes:内存一定保证的最小空闲空间。调太大造成可用内存减小;调太小可能系统急用内存时没有足够预留。
# sysctl -a | grep min_free
vm.min_free_kbytes = 67584
vm.dirty_background_ratio:内存里脏数据到达该百分比时触发写磁盘(异步,其它应用仍可继续写)。
# cat /proc/sys/vm/dirty_background_ratio
10
vm.dirty_ratio:内存里脏数据到达该百分比时不能再写入脏数据,应用程序需等待,直到降到该值以下才能继续写。
# cat /proc/sys/vm/dirty_ratio
20
两者合起来理解:脏数据到 dirty_background_ratio(10%)时触发写磁盘(异步,别的应用仍可继续写);如果应用写内存比内存写磁盘快,达到 dirty_ratio(20%)时,写脏数据的应用要等待,直到降到 20% 以下。
调整建议:
| 参数 | 调大 | 调小 |
|---|---|---|
dirty_background_ratio |
一次写数据量大,提高写入磁盘速度;但可能造成磁盘 IO 峰值;物理内存不够时压缩缓存空间,命中率下降 | 速度较慢,但可削平 IO 峰值 |
dirty_ratio |
应用写内存繁忙时可缓解应用等待;物理内存不够时压缩缓存空间,命中率下降 | — |
六、IO 子系统
IO 即输入输出(input and output)。一个 IO 指从磁盘把数据读出来或把数据写到磁盘上。一个 IO 读写的大小为一个 OS block(Linux 下默认 4096 字节,但 RHEL6 的 boot 分区默认为 1024 字节)。
6.1 iostat
# iostat
Linux 2.6.32-279.el6.x86_64 (li.cluster.com) 04/25/2014 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
9.72 0.57 1.34 1.71 0.00 86.66
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 24.47 2157.44 43.86 17100165 347648
md127 0.02 0.13 0.00 1016 0
dm-0 0.01 0.08 0.00 672 0
CPU 字段:
| 字段 | 含义 |
|---|---|
%user |
CPU 在用户态执行进程的时间百分比 |
%nice |
CPU 在用户态模式下用于 nice 操作占用 CPU 总时间百分比 |
%system |
CPU 处在内核态执行进程的时间百分比 |
%iowait |
CPU 用于等待 I/O 操作占用 CPU 总时间百分比 |
%steal |
hypervisor 为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比 |
%idle |
CPU 空闲时间百分比 |
# iostat 2 # 每两秒显示所有分区 IO 状态
# iostat /dev/sda* 2 # 每两秒显示所有分区 IO 状态
| 字段 | 含义 |
|---|---|
tps |
每秒的 IO 传输次数 |
Blk_read/s |
每秒读了多少个 block(一个 block 为 512 bytes) |
Blk_wrtn/s |
每秒写了多少个 block |
Blk_read |
两次查看间隔内一共读了多少块(Blk_read/s 乘以间隔秒数);只看一次或多次的第一次,表示从开机到现在的读总量 |
Blk_wrtn |
两次查看间隔内一共写了多少块;只看一次或多次的第一次,表示从开机到现在的写总量 |
6.2 iostat 扩展选项
# iostat -kx -d sda 2 3
# 查看 sda 的 IO 状态,每两秒一次,共三次
# -k 把默认每秒多少块显示成每秒多少 KB
# -x 打印扩展选项
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 7.82 4.13 22.09 1.29 1028.68 21.69 89.83 0.15 6.45 2.02 4.72
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 3.50 0.00 3.00 0.00 26.00 17.33 0.02 8.00 7.50 2.25
| 字段 | 含义 |
|---|---|
rrqm/s |
每秒的读请求数 |
wrqm/s |
每秒的写请求数 |
r/s |
每秒完成多少个读 IO |
w/s |
每秒完成多少个写 IO(IOPS = r/s + w/s) |
rsec/s |
每秒读取多少扇区数据(一个扇区 512 字节) |
wsec/s |
每秒写了多少扇区数据 |
rkB/s |
每秒读了多少 KB 数据 |
wkB/s |
每秒写了多少 KB 数据 |
avgrq-sz |
平均请求数据的大小 |
avgqu-sz |
平均请求队列长度,越短越好 |
await |
平均完成 IO 需要等待多少时间,包含服务时间和队列等待时间 |
r_await |
CentOS7 新增,读请求的 await |
w_await |
CentOS7 新增,写请求的 await |
svctm |
服务时间,从 IO 请求产生到完成 IO 的时间 |
%util |
磁盘带宽使用百分比。一直 100% 说明磁盘很忙 |
6.3 其它查看 IO 的命令
vmstat 中:
bi:读的 block 数bo:写的 block 数
# sar -b # 查看历史的 IO 读写信息
七、网络子系统
网络监测是所有 Linux 子系统里最复杂的,有太多因素:延迟、阻塞、冲突、丢包等。更糟的是与 Linux 主机相连的路由器、交换机、无线信号都会影响整体网络,很难判断是 Linux 网络子系统的问题还是别的设备问题,增加了监测和判断的复杂度。现在使用的网卡都称为自适应网卡,能根据网络上不同设备导致的不同网络速度和工作模式自动调整。
7.1 网线线序
| 标准 | 线序(1–8) |
|---|---|
| 568B | 橙白、橙、绿白、蓝、蓝白、绿、棕白、棕 |
| 568A | 1、3 对换,2、6 对换 |
7.2 检查网卡连接
# mii-tool ens33 # CentOS7 默认网卡不叫 eth0,用 ip addr 查看
eth0: negotiated 100baseTx-FD, link ok
看到 link ok 说明网线连接正常,但并不代表网线完全正常(可能水晶头松了或信号线接触不良等)。
7.3 检测网卡当前负载
# sar -n DEV 2
02:09:37 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
02:09:39 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:09:39 PM eth0 659.69 255.10 40.16 344.18 0.00 0.00 0.00
02:09:39 PM br0 659.69 255.10 31.14 344.18 0.00 0.00 2.55
02:09:39 PM vmnet1 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:09:39 PM vmnet2 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:09:39 PM virbr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:09:39 PM virbr0-nic 0.00 0.00 0.00 0.00 0.00 0.00 0.00
| 字段 | 含义 |
|---|---|
rxpck/s |
每秒收到的数据包数 |
txpck/s |
每秒发送的数据包数 |
rxkB/s |
每秒收到的 KB |
txkB/s |
每秒发送的 KB |
7.4 iptraf
两台主机之间有网线(或无线)、路由器、交换机等设备。测试两台主机之间网络性能的一个办法是互发数据并统计结果,看吞吐量、延迟、速率。iptraf 是查看本机网络吞吐量的好工具,支持文字图形界面,很直观。
# yum install iptraf # 本地镜像 yum 源;CentOS7 里叫 iptraf-ng
# iptraf-ng # 直接打开,选择要查看的统计数据
八、服务优化说明
原文标题中列出的服务优化对象为 nginx、tomcat、mysql、oracle 等。具体的服务级调优需结合各服务自身的配置文件与运行状态进行,通用思路是:先通过上述 CPU、内存、IO、网络监测手段定位瓶颈所在子系统,再针对具体服务调整其并发连接数、缓存大小、连接池、工作进程数等参数,避免盲目调优。
此处评论已关闭