服务器越用越卡是很多Linux运维场景中的高频问题,不少运维人员排查半天也找不到明确的故障点,其实很多时候是一些容易被忽略的性能隐患长期积累导致的。下面我们就逐一揭秘这6个常见的性能隐患,以及对应的排查和优化方法。

隐患一:内存泄漏导致可用内存持续减少
很多服务在运行过程中如果存在内存管理不当的问题,会出现内存泄漏,占用的内存不会随业务结束释放,长期运行后可用内存越来越少,系统就会频繁使用swap交换空间,性能大幅下降。
排查方法可以使用top或者htop命令,观察进程的内存占用变化,如果某个进程RES值持续上涨且不回落,就可能存在内存泄漏。也可以使用valgrind工具对可疑服务做内存检测。
优化方案:如果是自研服务,需要修复内存泄漏的代码逻辑;如果是第三方服务,可以定期重启服务释放内存,或者升级到修复了相关问题的版本。
隐患二:磁盘IO达到瓶颈
如果服务器上有大量日志写入、数据库读写操作,或者磁盘本身性能不足,就容易出现IO瓶颈,表现为进程等待IO的时间过长,系统整体响应变慢。
可以用iostat -x 1命令查看磁盘IO状态,关注%util指标,如果该值长期接近100%,说明磁盘IO已经饱和。
优化方案:可以将高频读写的数据迁移到SSD磁盘,或者对磁盘做RAID提升IO性能;也可以优化应用的IO逻辑,减少不必要的磁盘读写,比如把临时数据放到内存中处理。
隐患三:僵尸进程大量堆积
僵尸进程是已经执行结束但是父进程没有回收其资源的进程,虽然不占用内存和CPU,但是会占用进程号,如果大量堆积会导致系统无法创建新进程,进而影响服务运行。
排查可以用ps -ef | grep defunct命令,查看是否有大量状态为Z的僵尸进程。
优化方案:找到僵尸进程的父进程,重启或者修复父进程的逻辑,让其正确回收子进程资源;如果是父进程已经异常退出,僵尸进程会被init进程接管并回收,也可以等待系统自动处理。
隐患四:内核参数配置不合理
Linux默认的内核参数不一定适配所有业务场景,比如TCP连接相关的参数、文件句柄数限制等,如果配置不合理,会在高并发场景下成为性能瓶颈。
可以通过sysctl -a查看当前内核参数,重点关注net.core.somaxconn、fs.file-max、vm.swappiness等参数。
优化方案:根据业务场景调整内核参数,比如高并发服务可以调大net.core.somaxconn和fs.file-max,减少swap使用可以调小vm.swappiness的值,调整后执行sysctl -p生效。
隐患五:无用后台服务占用系统资源
很多Linux系统默认会启动一些不需要的后台服务,比如蓝牙服务、打印服务等,这些服务会占用CPU、内存和网络端口,长期运行会消耗不必要的系统资源。
可以用systemctl list-unit-files --type=service | grep enabled查看所有开机自启的服务,筛选出不需要的服务。
优化方案:对于不需要的服务,执行systemctl disable 服务名关闭开机自启,同时执行systemctl stop 服务名停止当前运行的服务,释放占用的资源。
隐患六:日志文件无限制增长
如果应用的日志没有做轮转配置,日志文件会越来越大,不仅占用大量磁盘空间,还会导致日志写入速度变慢,甚至把磁盘空间占满,导致服务无法正常运行。
可以用du -sh /var/log/*查看日志目录的占用情况,找到异常大的日志文件。
优化方案:使用logrotate工具配置日志轮转,设置日志的保留大小、保留数量和压缩规则,比如下面的配置可以实现日志超过100M就轮转,保留5个备份:
# 编辑logrotate配置,比如针对nginx日志
vim /etc/logrotate.d/nginx
# 配置内容如下
/var/log/nginx/*.log {
size 100M # 日志达到100M时轮转
rotate 5 # 保留5个备份
compress # 压缩旧日志
delaycompress # 延迟压缩上一个备份
missingok # 日志不存在时不报错
notifempty # 日志为空时不轮转
create 0644 nginx nginx # 创建新日志文件的权限和属主
}日常运维中,我们可以定期用top、iostat、free等工具监控系统状态,提前发现这些性能隐患,针对性做优化,就能避免服务器越用越卡的问题,保障业务稳定运行。