ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux性能调优实战:从内核参数到CPU子系统的系统化方法

Linux性能调优实战:从内核参数到CPU子系统的系统化方法 简介这份文档面向企业级 Linux 运维工程师与系统管理员聚焦 Red Hat Enterprise Linux AS 与 SUSE LINUX Enterprise Server 两大发行版下的性能调优实践帮助读者在服务器场景中定位并解决资源占用高、响应慢等效率问题。资源包内含 1 个 docx 文件约 373KB以图文混排的文档形式系统梳理调优要点便于离线查阅与对照操作。内容围绕关闭非必要 daemons、停用 GUI 图形界面、修改内核参数三条主线展开并延伸至处理器、内存、文件系统与网络子系统的调优方法涵盖 runlevel 切换、sysctl 配置、进程优先级控制、TCP/IP 栈参数调整等具体知识点同时给出 Red Hat 与 SUSE 两套命令的差异对照。目前已有 239 人学习适合需要建立调优思路、按发行版查漏补缺的运维人员参考。1. 从一台跑满 8 核却卡成单核的 Xeon 说起有台 4 路 Xeon 服务器top里赫然显示 8 颗 CPU负载却始终压在 1 以下业务进程排队等得让人怀疑人生。翻完dmesg才发现Hyper-Threading 开了但跑的是 UP 内核SMP 调度器根本没上线——这就是典型的“参数没对齐硬件”。Linux 性能调优这件事从来不是背几条sysctl命令就能交差的它是一套从 daemons、runlevel、内核参数一路延伸到 CPU、内存、文件系统、网络子系统的系统性动作。这份《Linux 性能调优的几种方法》文档针对 Red Hat Enterprise Linux AS 和 SUSE LINUX Enterprise Server 两套企业级发行版把八类调优手段拆成了可执行的命令和参数表。它适合谁适合手里管着几台老 RHEL、SUSE 物理机想在不换硬件的前提下把吞吐和响应压出来的运维和系统工程师。下面我按“先关掉不该跑的、再调该调的、最后盯住别翻车”的顺序把这份资料里的东西拆开讲透。2. 关 daemons 与关 GUI先把白吃的资源收回来2.1 为什么关 daemons 是性价比最高的一刀服务器上跑着的后台服务有相当一部分是装机时默认带上的跟业务没半毛钱关系。sendmail、xfs、cups、bluetooth这类 daemon每一个都占着内存页、抢着 CPU 时间片、还在启动阶段拖慢 POST 之后的引导流程。关掉它们释放的不只是几十 MB 内存更是减少了进程调度器的负担和潜在的攻击面。文档里给的原则很直接缺省情况下多数服务器都可以安全停掉几个 daemonRed Hat 和 SUSE 各自有一张可调整进程表。但这里有个血泪经验别看着名字陌生就一刀切。xfs是 X Font Server关了它 X 就起不来只有确定这台机器永远不跑 GUI 才能动。portmap/rpcbind如果 NFS 还在用关了挂载直接崩。所以正确姿势是先列清单、再逐个判断依赖。2.2 停 daemon 与禁止自启的命令对照Red Hat 和 SUSE 在服务管理上的命令路径不一样这是实操里最容易记混的地方。以sendmail为例# Red Hat Enterprise Linux AS立即停止 sendmail /sbin/service sendmail stop # Red Hat禁止下次开机自启 /sbin/chkconfig sendmail off # SUSE LINUX Enterprise Server立即停止 /etc/init.d/sendmail stop # SUSE禁止下次开机自启-s 表示 set /sbin/chkconfig -s sendmail off逻辑说明service和/etc/init.d/是两套 init 脚本调用入口Red Hat 用前者SUSE 传统上用后者。chkconfig管的是各 runlevel 下的启动链接off会把对应 rc*.d 目录里的 S 链接删掉或改成 K 链接。参数上SUSE 的-s不是可有可无的装饰漏了它有些版本不会真正写入 runlevel 配置。想一次性看全所有 daemon 的启停状态用/sbin/chkconfig --list这条命令会按服务名逐行列出 0~6 每个 runlevel 的 on/off。注意文档里那句提示图形化的redhat-config-services或 YaST2 runlevel editor并不会显示全部 daemon有些没注册进配置界面的服务只能靠chkconfig --list才能揪出来。我一般会先把--list输出重定向到文件再对照业务依赖逐个标记。2.3 关 GUI 与 runlevel 的取舍Linux 服务器跑 GUI 基本等于白烧内存和 CPU。文档的建议是只要有可能就不启动 GUI所有管理任务走命令行或者用 webmin、Linuxconf、SWAT 这类基于 Web 的工具。需要图形时临时startx用完就退。runlevel 是控制这件事的总开关。查看当前级别runlevel # 输出如 N 5N 表示没有上一个级别5 表示当前在 X11切换级别用initinit 3 # 切到完全多用户模式不启动 X各 runlevel 的含义文档列得很清楚0 停机、1 单用户、2 不带 NFS 的多用户、3 完全多用户、4 未使用、5 X11、6 重启。两个绝对不能设为默认的级别是 0 和 6否则机器要么开机即关要么无限重启。改默认级别编辑/etc/inittab里的initdefault行SUSE 下可以用YaST runlevel图形化改。还有个省内存的小技巧默认保留 F1~F6 六个控制台用mingetty ttyx可以减少到 3 个。别小看这几个 getty 进程在内存吃紧的老机器上砍掉三个控制台能省出可观的常驻内存。提示即便关了 GUI远程依然可以起图形程序用ssh -X把 X 转发到本地显示即可服务器端不需要跑完整的桌面环境。3. 内核参数与 CPU 子系统sysctl 怎么改、Hyper-Threading 怎么用3.1 sysctl 的存储位置与两种改法Linux 内核参数统一挂在/proc/sys下/proc里还有各 PID 目录和内核信息文件。改参数有两条路命令行sysctl即时生效或者写进配置文件持久化。文档特别提醒缺省内核包含不必重启就能用sysctl的模块但如果装机时把这个功能移除了改完必须重启才生效。即时改一条# 临时修改重启后失效 sysctl -w vm.swappiness10持久化则写进/etc/sysctl.conf# 追加到 /etc/sysctl.conf echo vm.swappiness 10 /etc/sysctl.conf # 重新加载全部配置 sysctl -p逻辑说明-w是 write直接写/proc/sys对应节点-p是 load从配置文件批量读取。参数说明vm.swappiness控制内核把内存页换出到 swap 的倾向值越低越不愿意换出数据库服务器通常调到 10 甚至更低。Red Hat 还提供图形化的redhat-config-procSUSE 提供yast powertweak和字符界面的yast2 powertweak不想记命令的可以用这些入口。3.2 处理器子系统Hyper-Threading 与内核选择CPU 往往是应用和数据库服务器最先撞上的瓶颈。在配 Xeon 的高端服务器上Hyper-Threading 能把一颗物理处理器在操作系统里虚拟成两颗让处理器同一时刻执行两个线程。文档给了一组很实在的性能提升区间物理 CPU 数量启用 Hyper-Threading 的预期提升2 颗15% ~ 25%4 颗1% ~ 13%8 颗0% ~ 5%这组数字说明一个反直觉的结论CPU 越多HT 带来的收益越小。原因是物理核心已经足够多时共享执行单元的资源争抢会抵消虚拟核心的好处。所以 8 路机器上为了 HT 去折腾性价比很低。启用 HT 有个硬前提必须跑基于 SMP 的内核。文档里那句提示是关键——只有 SMP 内核才支持 Hyper-Threading。验证方法很简单top里按1展开如果 4 路机器显示 8 颗 CPU说明 SMP 内核加 HT 都生效了如果只显示 4 颗要么 HT 没开要么内核是 UP 的。选内核同样影响性能。Red Hat Enterprise Linux AS 和 SUSE LINUX Enterprise Server 都带多个内核包文档用 Table 10-6 列出了可选内核。常见做法是多路服务器选 SMP 内核大内存机器选支持大页或 PAE 的内核64 位扩展EM64T场景选对应的 64-bit 内核。选错了内核后面所有调优都是白费。3.3 内核参数里跟性能关系最密切的几张表文档 Table 10-5 列了 Red Hat V2.4 下与性能密切相关的内核参数。这类参数没有万能值得结合业务读写比例来定。我一般会先把当前值 dump 出来存档改一个、测一个绝不批量改。原因很简单内核参数之间会互相影响一次改五个出了问题根本不知道是哪个引起的。这也是文档反复强调的“每次只改变一个参数然后监测效果”。4. 内存、文件系统与网络子系统三块最难调的地方4.1 内存子系统bdflush 与 kswapd 的九个参数内存调优是八块里最玄学的文档开篇就说了它“不是很容易需要不停地监测来保证改变不会对其他子系统造成负面影响”。核心是两个 daemonbdflush管脏缓冲区回写磁盘kswapd管内存页交换。vm.bdflush有 9 个参数文档建议只动其中 3 个# 修改 bdflush 参数 sysctl -w vm.bdflush30 500 0 0 500 3000 60 20 0参数说明按位置第 1 个nfract排队写入磁盘前bdflush 允许的缓冲区最大百分比示例值 30。第 2 个ndirtybdflush 即刻写的最大缓冲区值示例值 500。这个值越大bdflush 完成一次磁盘更新耗时越长。第 7 个nfract_sync发生同步前缓冲区变 dirty 的最大百分比示例值 60。vm.kswapd三个参数sysctl -w vm.kswapd1024 32 64参数说明tries_base相当于内核每次交换“页”数量的四倍示例 1024。交换信息多的系统调大它能改善性能。tries_min每次 kswapd 换出的最小页数示例 32。swap_clusterkswapd 即刻写入的页数示例 64。数值小有利于磁盘 I/O数值大可能对请求队列产生负面影响。改完必须用vmstat盯效果。文档还列了其他可调的虚拟内存参数buffermem、freepages、overcommit_memory、page-cluster、pagecache、pagetable_cache。我的习惯是先把vmstat 1跑起来改完参数看si/so换入换出和bi/bo块设备读写有没有异常抖动抖了立刻回滚。4.2 文件系统与网络从 TIME-WAIT 到 ipfrag网络子系统的调优文档写得最细因为它对 CPU 和内存的连带影响最大——大量 TCP 连接、块尺寸又小时内存占用会明显上升。这里挑几个最实用的。TIME-WAIT 套接字复用对 Web 服务器尤其有效# 允许新连接复用 TIME-WAIT 套接字 sysctl -w net.ipv4.tcp_tw_reuse1 # 配合开启 TIME-WAIT 快速循环 sysctl -w net.ipv4.tcp_tw_recycle1逻辑说明每个 TCP 连接关闭后会进入 TIME-WAIT 状态占着端口和内存高并发短连接场景下会堆积大量 TIME-WAIT。开启复用和快速循环后连接数量会明显下降。但要注意tcp_tw_recycle在 NAT 环境下可能引发连接异常内网纯服务器场景才建议开。缩短 FIN-WAIT-2 时间sysctl -w net.ipv4.tcp_fin_timeout30参数说明tcp_fin_timeout是套接字关闭时保持 FIN-WAIT-2 状态的时间。TCP 连接以三段 SYN 开始、三段 FIN 结束都不带数据。把这个值调小FIN 序列到内存释放的间隔缩短内存能更快空出来处理新连接。文档强调改这个值前要认真监测避免死套接字造成内存溢出。TCP keepalive 从 2 小时改到 30 分钟sysctl -w net.ipv4.tcp_keepalive_time1800大量被打开却没使用的连接默认要等 2 小时才被 keepalive 丢掉这期间内存一直被占着。改成 1800 秒是更合理的选择。收发缓存设为 8MBsysctl -w net.core.rmem_max8388608 sysctl -w net.core.wmem_max8388608 sysctl -w net.ipv4.tcp_rmem4096 87380 8388608 sysctl -w net.ipv4.tcp_wmem4096 65536 8388608参数说明tcp_rmem和tcp_wmem各设三个值——最小值、初始值、最大值第三个值必须小于或等于rmem_max和wmem_max否则设置不生效。这是文档明确点出的约束。backlog 队列调到 4096sysctl -w net.ipv4.tcp_max_syn_backlog4096参数说明服务器负载重或客户端超长延时连接多时half-open 连接会增加这些连接堆在 backlog 队列里。默认 1024调到 4096 能防止 syn-flood 攻击即便服务器不接收这类连接也有保护作用。ipfrag 参数NFS 和 Samba 服务器尤其要设sysctl -w net.ipv4.ipfrag_high_thresh393216 sysctl -w net.ipv4.ipfrag_low_thresh262144参数说明这两个值控制用于重组 IP 碎片的最大、最小内存。当碎片达到ipfrag_high_thresh就被丢弃直到降到ipfrag_low_thresh。示例值对应 384MB 和 256MB 的内存范围。TCP 数据包传输出错时开始碎片整理有效包留内存损坏包被转发。安全相关的几条也顺带提一下关闭源路由、开启 TCP SYN cookies 防 syn-flood、忽略 ICMP 重定向、拒绝广播风暴和 smurf 攻击、忽略 ping。这些命令文档里说“被设置为缺省值”但实际环境里经常被改乱值得逐条核对。5. 避坑与排查五条改参数改出来的事故5.1 改完 sysctl 没生效重启后全丢现象sysctl -w执行后cat /proc/sys/...看到新值重启后回到旧值。原因-w只写运行时内存没写/etc/sysctl.conf。解决所有要持久化的改动都追加到/etc/sysctl.conf改完sysctl -p验证一遍再重启确认。5.2 关了 xfs 导致 X 起不来现象停掉xfsdaemon 后执行startx报字体服务连接失败。原因xfs是 X Font ServerGUI 依赖它提供字体。解决需要 GUI 时先service xfs start再startx确定不用 GUI 的服务器才永久关闭。5.3 4 路机器只认 4 颗 CPU现象BIOS 里 HT 已开top只显示 4 颗 CPU。原因跑的是 UP 内核不支持 SMP 和 Hyper-Threading。解决换成 SMP 内核包重启后确认top显示 8 颗。文档明确只有 SMP 内核才支持 HT。5.4 批量改内核参数后性能反而下降现象一次改了 bdflush、kswapd、tcp_rmem 等多个参数系统响应变慢vmstat里si/so飙升。原因参数之间互相影响无法定位是哪个引起的。解决回滚到改动前的存档值然后每次只改一个参数用vmstat、top监测至少一个业务周期再决定是否保留。5.5 tcp_tw_recycle 开了之后部分客户端连不上现象开启tcp_tw_recycle后经过 NAT 的客户端频繁连接超时。原因快速循环对 NAT 环境下的时间戳处理有兼容问题。解决纯内网服务器可以开有 NAT 或负载均衡的场景只开tcp_tw_reuse关掉tcp_tw_recycle。6. 把调优做成可回滚的流程我的参数存档与验证习惯调优最怕的不是调错是调错了还不知道错在哪、回不去。文档里那句“每次只改变一个参数然后监测效果”说起来简单做起来需要一套固定动作。我现在每次上机调优第一步永远是存档# 存档当前所有内核参数 sysctl -a /root/sysctl-backup-$(date %Y%m%d).conf # 存档当前 runlevel 和服务状态 runlevel /root/runlevel-backup.txt /sbin/chkconfig --list /root/chkconfig-backup.txt这份存档就是后悔药。改崩了直接sysctl -p /root/sysctl-backup-xxx.conf回滚比凭记忆一条条改回来靠谱得多。第二步是建立基线。调优前先跑一轮监测把正常状态下的数字记下来# CPU 和内存基线 vmstat 1 10 # 网络连接状态分布 netstat -an | awk /^tcp/ {print $6} | sort | uniq -c # 磁盘 I/O iostat -x 1 5vmstat看r运行队列、si/so换页、bi/bo块 I/Onetstat那条统计各 TCP 状态的数量TIME-WAIT 堆积多少一目了然iostat -x看%util和await。没有基线改完参数你根本判断不了是变好还是变坏。第三步才是动手改而且严格一次一个。改完至少观察一个完整业务周期——Web 服务看一个访问高峰数据库看一轮批处理。确认无异常再改下一个。这套流程慢但它是唯一能让你在出问题时说清楚“是哪个参数引起的”的办法。最后说个容易被忽略的点文档针对的是 Red Hat Enterprise Linux AS 和 SUSE LINUX Enterprise Server两套系统的命令路径、配置文件位置、图形工具入口都不一样。同一台机器上混用两套命令轻则报错重则改错文件。我一般会在机器上贴张便签写明发行版和对应命令省得半夜排障时手忙脚乱。从那以后我每次调优都强制走一遍“存档—基线—单改—验证”四步再没出现过改完不知道回哪去的情况。希望帮到你。本文还有配套的精品资源点击获取
返回列表