文章目录
一、前言
Linux系统常常作为服务器和桌面操作系统的主流选择,其性能调优是开发人员和系统管理员的重要任务。
Linux系统的性能是指操作系统完成任务的有效性、稳定性和响应速度。Linux系统管理员可能经常会遇到系统不稳定、响应速度慢等问题,例如在Linux上搭建了一个web服务,经常出现网页无法打开、打开速度慢等现象,而遇到这些问题,就有人会抱怨Linux系统不好,其实这些都是表面现象。
操作系统完成一个任务时,与系统自身设置、网络拓朴结构、路由设备、路由策略、接入设备、物理线路等多个方面都密切相关,任何一个环节出现问题,都会影响整个系统的性能。因此当Linux应用出现问题时,应当从应用程序、操作系统、服务器硬件、网络环境等方面综合排查,定位问题出现在哪个部分,然后集中解决。
随着容器时代的普及和AI技术的颠覆,面对越来越复杂的业务和架构,再加上企业的降本增效已提上了日程,因此对Linux的高性能、可靠性提出了更高的要求,Linux性能优化成为运维人员的必备的核心技能。
二、影响Linux系统性能的因素一般有哪些?
Linux系统的性能受多个因素的影响。以下是一些常见的影响Linux系统性能的因素:
- CPU负载:CPU的利用率和负载水平对系统性能有直接影响。高CPU负载可能导致进程响应变慢、延迟增加和系统变得不稳定。
- 内存使用:内存是系统运行的关键资源。当系统内存不足时,可能会导致进程被终止、交换分区使用过多以及系统性能下降。
- 磁盘I/O:磁盘I/O性能是影响系统响应时间和吞吐量的重要因素。高磁盘I/O负载可能导致延迟增加、响应变慢和系统性能下降。
- 网络负载:网络流量的增加和网络延迟会对系统性能产生影响。高网络负载可能导致网络延迟增加、响应变慢和系统资源竞争。
- 进程调度:Linux系统使用进程调度器来管理和分配CPU资源。调度算法的选择和配置会影响进程的优先级和执行顺序,从而影响系统的响应能力和负载均衡。
- 文件系统性能:文件系统的选择和配置对磁盘I/O性能有影响。不同的文件系统可能在性能方面有所差异,适当的文件系统选项和调整可以改善系统性能。
- 内核参数:Linux内核有许多可调整的参数,可以影响系统的性能和行为。例如,TCP/IP参数、内存管理参数、文件系统缓存等。适当的内核参数调整可以改善系统的性能和资源利用率。
- 资源限制和配额:在多用户环境中,资源限制和配额的设置可以控制每个用户或进程可使用的资源量。适当的资源管理可以避免某些进程耗尽系统资源而导致性能问题。
这些因素之间相互关联,对系统性能产生综合影响。为了优化Linux系统性能,需要综合考虑并适当调整这些因素,以满足特定的需求和使用情况。
三、Linux 系统性能调优技巧盘点
3.1 CPU 性能分析
利用 top、vmstat、pidstat、strace 以及 perf 等几个最常见的工具,获取 CPU 性能指标后,再结合进程与 CPU 的工作原理,就可以迅速定位出 CPU 性能瓶颈的来源。
比如说,当你收到系统的用户 CPU 使用率过高告警时,从监控系统中直接查询到,导致 CPU 使用率过高的进程;然后再登录到进程所在的 Linux 服务器中,分析该进程的行为。你可以使用 strace,查看进程的系统调用汇总;也可以使用 perf 等工具,找出进程的热点函数;甚至还可以使用动态追踪的方法,来观察进程的当前执行过程,直到确定瓶颈的根源。
3.2 内存性能分析
可以通过 free 和 vmstat 输出的性能指标,确认内存瓶颈;然后,再根据内存问题的类型,进一步分析内存的使用、分配、泄漏以及缓存等,最后找出问题的来源。
比如说,当你收到内存不足的告警时,首先可以从监控系统中。找出占用内存最多的几个进程。然后,再根据这些进程的内存占用历史,观察是否存在内存泄漏问题。确定出最可疑的进程后,再登录到进程所在的 Linux 服务器中,分析该进程的内存空间或者内存分配,最后弄清楚进程为什么会占用大量内存。
3.3 磁盘和文件系统 I/O 性能分析
当你使用 iostat ,发现磁盘 I/O 存在性能瓶颈(比如 I/O 使用率过高、响应时间过长或者等待队列长度突然增大等)后,可以再通过 pidstat、 vmstat 等,确认 I/O 的来源。接着,再根据来源的不同,进一步分析文件系统和磁盘的使用率、缓存以及进程的 I/O 等,从而揪出 I/O 问题的真凶。
比如说,当你发现某块磁盘的 I/O 使用率为 100% 时,首先可以从监控系统中,找出 I/O 最多的进程。然后,再登录到进程所在的 Linux 服务器中,借助 strace、lsof、perf 等工具,分析该进程的 I/O 行为。最后,再结合应用程序的原理,找出大量 I/O 的原因。
3.4 网络性能分析
而要分析网络的性能,要从这几个协议层入手,通过使用率、饱和度以及错误数这几类性能指标,观察是否存在性能问题。比如 :
在链路层,可以从网络接口的吞吐量、丢包、错误以及软中断和网络功能卸载等角度分析;
在网络层,可以从路由、分片、叠加网络等角度进行分析;
在传输层,可以从 TCP、UDP 的协议原理出发,从连接数、吞吐量、延迟、重传等角度进行分析;
比如,当你收到网络不通的告警时,就可以从监控系统中,查找各个协议层的丢包指标,确认丢包所在的协议层。然后,从监控系统的数据中,确认网络带宽、缓冲区、连接跟踪数等软硬件,是否存在性能瓶颈。最后,再登录到发生问题的 Linux 服务器中,借助 netstat、tcpdump、bcc 等工具,分析网络的收发数据,并且结合内核中的网络选项以及 TCP 等网络协议的原理,找出问题的来源。
3.5 关闭daemons
有些运行在服务器中的daemons (后台服务),并不是完全必要的。关闭这些daemons可释放更多的内存、减少启动时间并减少CPU处理的进程数。减少daemons数量的同时也增强了服务器的安全性。缺省情况下,多数服务器都可以安全地停掉几个daemons。
Table 10-1列出了Red Hat Enterprise Linux AS下的可调整进程.
Table 10-2列出了SUSE LINUX Enterprise Server下的可调整进程.
注意:关闭xfs daemon将导致不能启动X,因此只有在不需要启动GUI图形的时候才可以关闭xfs daemon。使用startx命令前,开启xfs daemon,恢复正常启动X。
可以根据需要停止某个进程,如要停止sendmail 进程,输入如下命令:
Red Hat: /sbin/service sendmail stop
SUSE LINUX: /etc/init.d/sendmail stop
也可以配置在下次启动的时候不自动启动某个进程,还是sendmail:
Red Hat: /sbin/chkconfig sendmail off
SUSE LINUX: /sbin/chkconfig -s sendmail off
除此之外,LINUX还提供了图形方式下的进程管理功能。对于Red Hat,启动GUI,使用如下命令: /usr/bin/redhat-config-services 或者鼠标点击 Main Menu -> System Settings ->
Server Settings -> Services.
提示:并非所有的daemons都会显示在该配置界面,如要看到全部的daemons,使用如下命令:
/sbin/chkconfig –list
对于SUSE LINUX,图形界面是YaST2, 可用如下命令来启动
/sbin/yast2 runlevel 或者如Figure 10-2所示用鼠标点击
Browse: YaST/ ?> YaST modules ?> System ?> Runlevel editor
3.6 关闭GUI
只要有可能,就不要在Linux server上启动GUI图形,通常在Linux server上,没有必要启动GUI。,所有的管理任务均可在命令行方式下完成、或者通过重定向X和Web浏览器界面。有几个可用的基于Web的工具(例如webmin, Linuxconf, 和SWAT).
需要的时候启动GUI,用完马上关闭GUI。多数情况,服务器运行在runlevel 3,即在机器启动的时候不进入GUI。命令行方式下,执行startx 来启动Xserver.
- 查看runlevel的命令:runlevel
会显示出上次和当前的runlevel (如N 5 表示没有上次的runlevel (N) ,当前的runlevel是5). - 在不同的runlevels之间切换,使用命令 init
如切换到run level 3,键入命令init 3
下边是对Linux中不同runlevels的简要描述
– 0 – Halt 停机(不要将0设置为缺省,否则服务器启动后就会马上关闭)
– 1 - Single user mode 单用户模式
– 2 - Multi-user 不带NFS的多用户模式 (如果没有网络,相当与3)
– 3 - Full multi-user mode 完全多用户模式
– 4 – Unused 未使用
– 5 - X11
– 6 – Reboot 重启(不要将6设置为缺省,否则服务器会不断地重启)
修改文件/etc/inittab 来设置机器启动的runlevel,如Figure 10-3。
对于SUSE LINUX Enterprise Server, 执行YaST runlevel 命令改变缺省runlevel值.
如图Figure 10-2。
缺省情况下,保存了6个控制台:F1……F6。为节省内存,可以减少为3个。使用mingetty ttyx命令来实现,如图Figure 10-3
提示:即便是已经关闭了GUI,依然可以远程连接并启动GUI,可以使用ssh-x。
3.7 改变内核参数
Linux内核是操作系统的核心,对所有的Linux发行版本是通用的。内核参数可以改变,在命令行下执行sysctl 命令。
提示:缺省情况下,LINUX内核包括不必重启就可以使用sysctl命令的必要的模块。尽管如此,如果你在安装系统的时候选择移除该功能,那么你只有重新启动LINUX,才可以使得改变生效。
SUSE LINUX 提供了图形界面下的修改方式。使用如下命令来启动powertweak工具:
/sbin/yast powertweak
使用如下命令启动基于字符的管理菜单:
/sbin/yast2 powertweak
Red Hat也提供了图形界面下更改sysctl参数的方式:
/usr/bin/redhat-config-proc
如图Figure 10-5:
Parameter storage locations
内核参数保存在/proc(特别是/proc/sys),提供了内核、处理器、内存、网络及其他组件的相关参数。每个执行的进程都有一个以相应PID命名的目录。Figure 10-3列出了一些包括内核信息的文件。
3.8 针对TCP和UDP的调优
下边的命令用来对连接数量非常大的服务器进行调优。
对于同时支持很多连接的服务器,新的连接可以重新使用TIME-WAIT套接字. 这对于Web服务器非常有效:
如果你使用该命令,还要启动TIME-WAIT 套接字状态的快速循环功能:
图Figure 10-7显示出将这些功能启用,连接数量明显降低.因为每个TCP传输都包含远程客户端的协议信息缓存,所以有利于提高性能.缓存中存放round-trip时间、最大segment大小、拥塞窗口的信息。
参数tcp_fin_timeout 是套接字关闭时,保持FIN-WAIT-2状态的时间。一个TCP连接以three-segment SYN序列开始, 以three-segment FIN序列结束.均不保留数据.通过改变tcp_fin_timeout的值, 从FIN序列到内存可以空闲出来处理新连接的时间缩短了,使性能得到改进.改变这个值的前要经过认真的监测,避免因为死套接字造成内存溢出.
服务器的一个问题是,同一时刻的大量TCP连接里有很多的连接被打开但是没有使用. TCP的keepalive功能检测到这些连接,缺省情况下,在2小时之后丢掉. 2个小时的可能导致内存过度使用,降低性能.因此改成1800秒(30分钟)是个更好的选择:
对于所有协议的队列,设置最大系统发送缓存(wmem) 和接收缓存(rmem)到8MB
这些设置指定了创建TCP套接字时为其分配的内存容量. 另外,使用如下命令发送和接收缓存.该命令设定了三个值:最小值、初始值和最大值:
第三个值必须小于或等于wmem_max和rmem_max。
(SUSE LINUX Enterprise Server适用) 通过保留路径验证来源数据包。缺省情况下,路由器转发所有的数据包,即便是明显的异常网络流量。通过启动和是的过滤功能,丢掉这些数据包:
当服务器负载繁重或者是有很多客户端都是超长延时的连接故障,可能会导致half-open连接数量的增加。这对于Web服务器很来讲很平常,尤其有很多拨号客户时.这些half-open连接保存在 backlog connections 队列中.将这个值最少设置为4096 (缺省为1024). 即便是服务器不接收这类连接,设置这个值还能防止受到denial-of-service (syn-flood)的攻击.
设置ipfrag参数,尤其是NFS和Samba服务器。这里,我们可以设置用于重新组合IP碎片的最大、最小内存。当ipfrag_high_thresh值被指派,碎片会被丢弃直到达到ipfrag_low_thres值。
当TCP数据包传输发生错误时,开始碎片整理。有效的数据包保留在内存,同时损坏的数据包被转发。例如,设置可用内存范围从256 MB到384 MB
四、总结
Linux系统性能调优是一个复杂而细致的过程,需要从硬件、软件、内核参数、进程管理等多个方面入手。通过综合运用上述技巧和方法,可以显著提升Linux系统的性能和稳定性,为用户提供更好的使用体验。
参考:Linux操作系统性能调优的方法