Linux性能调优指南
在很久以前,就对性能调优有⾮常浓厚的兴趣。虽然之前也在做过⼀些性能调优的⼯作,但是主要集中在代码层⾯,以及业务层⾯。对如何从Linux操作系统⽅⾯进⾏调优,⼀直都没有⼀个清晰的认识。不过,最近偶然发现了⼀本IBM出的Linux调优指南,于是就拜读了⼀下。
读完⼀些之后,就发现这本书确实就是我所需要的⼀本书。
虽然之前读过⼀些关于操作系统的书籍,但是并不懂如何把它们应⽤到性能调优中。⽽从⽹上看到的⼀些关于性能调优的⽂章,也主要是集中在检测并发现性能瓶颈这些我们早就清楚的内容。对于发现瓶颈之后,如何调优,从哪些⽅⾯进⾏调优,这背后的原理是什么,为什么要这么调优,却没有详细的说明。
⽽这本书恰恰弥补了这个空缺。弥补了操作系统⾼层理论以及底层调优之间的空缺。我们熟悉的操作系统,以及计算机⽹络,他们的处理过程,都是⼀些可以优化的点。
这本书,其实称为指南更合适。从CPU,内存,IO,计算机⽹络等⽅⾯,⼀⼀为我们展⽰了优化的过程。
这本指南也不厚,⼤概只有160页。内容不多,⾮常精简。同时也造成了⼀个缺点,就是,很多内容并
不能全⾯铺开。
但是感觉⽤这本指南来进⼊性能调优的世界,还是绰绰有余的。
这本指南的名称是,《Linux Performance and Tuning Guidelines》。
这篇⽂章,便是我在读完这本指南的时候,摘录的⼀些笔记。
CPU⽅⾯
处理器指标
CPU使⽤率: 每个处理器的利⽤率
user time: CPU执⾏⽤户代码的时间,包括nice time
system time: CPU执⾏内核代码的时间,包括IRQ和softirq time
waiting: CPU等待IO的时间
Idle time: CPU空闲并等待任务的时间
nice time: CPU花在改变进程优先级以及执⾏顺序的时间
load average: 任务队列中,等待被CPU执⾏的任务的总数,以及那些等待不可中断任务完成的任务的总数,它们的平均值。也就是,系统中处于TASK_RUNNABLE以及TASK_UNINTERRUPTIBLE状态的任务的总数的平均值。
Runnable process: 等待被CPU执⾏的任务的总数
Blocked: 那些因为IO操作被挂起的进程的数量
Context switch: 系统中线程切换的总数。
Interrupt: 硬中断和软中断的次数。
消除CPU瓶颈的⽅法
确保后台没有不必要的程序
给那些不重要并且是CPU密集型的应⽤调整优先级,让其优先级相对较低⼀些
更新CPU
内存⽅⾯
内存指标
Free memory: 空闲内存。在Linux中,内核会将没有使⽤的内存中的⼤部分分配给⽂件系统缓存。所以,Free memory减去buffers 以及cache占⽤的内存的数量,才是系统中真正的空闲内存的数量。
swap usage: swap in/out衡量内存是否出现了瓶颈才更加正确。因为Linux内核如果发现内存中的⼀些page,长时间没有被⽤到,就回将它放到swap中。⽽并不是说,只有当内存不⾜的时候,才会将page放到swap中。如果每秒有200-300次 swap in/out,那么说明系统的内存可能是瓶颈。
Buffer and cache: 为⽂件系统和block size分配的缓存
slab: 内核使⽤的内存数量。需要注意的是,内核使⽤的page不能被page out到磁盘中
active versus inactive memory: inactive memory将会被kswapd daemon swap out到磁盘中。
free⼯具输出解释
0.png
消除内存瓶颈的⽅法
调整page的⼤⼩
调整处理active和inactive内存的⽅式
降低page-out的速度
限制服务器上每个⽤户能够使⽤的内存的数量
批评与自我批评500条停⽌不需要的service
增加内存
⽂件系统⽅⾯
⽂件系统指标
IOWait: CPU等待IO操作的时间
Average queue length: 未完成的IO请求的数量
Average wait: IO请求等待被处理的时间,毫秒级
Transfers per second: 每秒有多少IO操作被执⾏舍曲林改善性功能
Blocks read/write per seconds: 每秒中读和写block的数量。在2.6版本的内核中,以block⼤⼩为1KB衡量。不同的内核版本中,block⼤⼩不同,从512bytes到4KB不等
Kilobytes per second read/write: 每秒读写block device的数据量,⽤kilobytes来衡量
Linux中常见的⽂件系统
Ext2
Ext3
ReiserFS
Journal File System(JFS)
XFS
其中,Ext3能够保证数据的⼀致性。⽽且,还能够通过配置journal mode,在数据的完整性和速度之间取得⼀个较好的平衡。
⽽JFS和XFS,主要⽤在需要⽀持⼤⽂件的场景中。
消除⽂件系统瓶颈的⽅法
如果程序访问磁盘的⽅式是顺序访问,那么就换⼀个更好的磁盘控制器。如果是随机访问的,那么就增加更多的磁盘控制器使⽤RAID。RAID的读性能⽐较⾼,但是写性能低⼀些。⽽且,优先使⽤基于硬件实现的RAID。
给磁盘合理分区
增加内存
通过/proc/sys/vm/dirty_background_ratio来调整内存中有多少脏数据时,pdflush daemon才将这些数据写⼊到磁盘通过ionice来分配IO操作的优先级:
idle: 最低的优先级,只有当没有⾼优先级的进程访问磁盘时,才有资格访问磁盘
Best-effort: 默认优先级。从CPU优先级中继承
Real time: 最⾼的优先级。进程总是能够访问磁盘。
禁⽌access time updates
选择合适的⽂件系统,以及合适的journal模式
调整block size:
如果你的服务器,更多的是处理⼩的⽂件,那么将block size调⼩⼀点,可能会提⾼性能。但是如果处理⼤⽂件更多,那么调⼤⼀点可能会提⾼性能。但是这⼀项对性能提升并不⼤,所以,默认使⽤操作系统的4k的block size就好。
⽹络⽅⾯
⽹络指标
Packets received and sent
Bytes received and sent
Collisions per second: ⽹络中发⽣的碰撞数量。⼀个配置正确的⽹络中,应当很少发⽣碰撞
Packet dropped: 被丢弃的包的数量。包括被防⽕墙过滤掉的,以及由于buffer空间不够⽽丢掉的
Overruns: buffer空间溢出的次数
Errors: 出错的包的数量
汇编指令跳转指令数据传输的过程
应⽤程序开启⼀个Socket并将数据写⼊到这个Socket的buffer中
数据经过TCP/IP协议栈⼀层层地做⼀些处理,包装。数据并不会层层复制,因为这样性能不好。在内核中,只是修改buffer中的引⽤,将其传递给下⼀层
数据通过⽹络到达另⼀台主机,我们暂且称它为主机B
如果这个包的MAC地址就是主机B,那么把它放到主机B的socket buffer中
主机B给CPU发出⼀个硬中断
主机B再将数据通过TCP/IP协议栈的层层处理,传递给应⽤层
Linux中的协议栈,更注重的是可靠性和低延迟,⽽不是低开销和⾼吞吐量。
由于每⼀个数据包都会引发⼀次中断,所以,Linux中引⼊了⼀项叫做NAPI的技术。当第⼀个数据包到来时,还是跟之前⼀样,会引发⼀次中断。但是从此之后,⽹络接⼝会启动轮训模式,即,当有数据包到达时,不会发出中断,⽽是直到buffer都满了的时候,才发出⼀个中断。这样就能减少中断的次数。
TCP/IP传输窗⼝
TCP/IP传输窗⼝指的是,在收到ACK响应之前,最多能够发送的数据量。接收主机会通过TCP⾸部中的window size字段告诉发送主机传输窗⼝的⼤⼩。通过使⽤传输窗⼝,TCP能够处理地效率更⾼⼀些,因为发送主机不需要等待每⼀个数据包的ACK。
⾼速⽹络中,可以使⽤⼀种叫做窗⼝伸缩的技术,来增加传输窗⼝的⼤⼩。
Offload
如果你的⽹络适配器⽀持offload功能,那么你可以内核就可以将⼀部分⼯作转移到⽹络适配器,来减少CPU的⼯作量,进⽽提⾼性能。
linux操作系统书籍常见的offload功能有:
Checksum Offload: 每⼀个数据包中,都会有⼀个校验码,⽤于验证这个数据包是否在传输过程中出现了问题
TCP segmentation offload: 当要传输的数据量⼤于MTU的时候,就要对数据进⾏分段处理。
消除⽹络瓶颈的⽅法
确保⽹卡的配置和路由器以及交换机的配置配套
调整⽹络的拓扑结构
使⽤更快的⽹卡
在内核中调整关于⽹络的参数
MTU
接收和发送缓冲区的⼤⼩
传输窗⼝
通过调整p_tw_reuse参数让处于TIME_WAIT状态的Socket对新连接可重⽤
通过调整tcp_fin_timeout参数,让处于FIN-WAIT-2状态的Socket可以早⼀些关闭,进⽽节省内存
通过调整tcp_keepalive_time参数,调整keepalive连接的关闭时间
通过调整tcp_max_syn_backlog参数来调整最⼤能够容纳的处于半连接状态的socket的数量
关闭⼀些不需要的服务,以及端⼝号
Linux的⼯具
性能监控⼯具
top
vmstat
uptime, wxshell个人免费版官方
ps, pstree
free
iostat
sar
mpstat
numastat
pmap
netstat
iptraf
tcpdump, etheral
nmon
strace
proc file system
KDE System guard
Gnome System Monitor
分析⼯具
lmbench
iozone
netperf
/proc
/proc⽬录中的内容,对于查看系统状态,应⽤程序的状态⾄关重要。
/proc⽬录中,⼜有这么⼏块:
名称为数字的⽬录:每⼀个这样的⽬录,⾥⾯都包含了pid为这个数字的对应的进程的信息,⽐如,进程使⽤的虚拟内存
acpi: ACPI中包含⼀些⾼级配置,以及电源管理等信息。因为ACPI主要是⽤在笔记本,或者个⼈PC中,所以,在服务器上,⼀般是禁⽤的
bus: 包含了⼀些和bus相关的信息,⽐如PCI bus或者USB接⼝
irq: 包含和中断相关的信息。每个⼦⽬录都对应⼀种中断。我们可以通过直接修改对应⼦⽬录的信息,来将中断绑定到⼀个CPU上net: 包含和⽹络相关的统计信息
scsi: 包含和SCSI相关的信息
sys: 包含和内核相关的参数
spicestty: 包含和tty相关的信息
从安装Linux就开始调优
考虑下⾯⼏个问题:
安装什么版本的Linux?
商业版的还是开源版本的?
选择商业版的哪⼀个版本?
选择正确的内核
有这么⼏种内核。
standard: 应⽤在单处理器上
SMP: ⽀持SMP以及超线程技术。⼀些实现也⽀持NUMA.
Xen: 包括⼀个可以在Xen虚拟机上运⾏的Linux版本
如何给磁盘分区?
尽可能使⽤交换分区⽽不是交换⽂件。交换分区相对于交换⽂件来讲,没有⽂件系统上的开销。
使⽤什么⽂件系统?
安装时,尽可能少安装包还是安装全部的包?
防⽕墙配置
SELinux
Runlevel选择
除⾮有特别需求,否则服务器上都是使⽤runlevel 3.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。