一、为什么我的Linux系统越用越慢?
不知道你有没有遇到过这样的情况:刚装好的Linux系统跑得飞快,用着用着就开始卡顿了。打开个文件要等半天,编译个程序时间翻倍,连敲个命令都要思考人生。这很可能是因为默认的内核参数在作怪。
Linux内核自带了一套默认参数,这些参数就像工厂的默认设置,是为了保证兼容性而设计的保守值。但就像买来的新衣服需要调整才合身一样,这些参数也需要根据你的实际使用场景来优化。
举个例子,默认的文件描述符限制通常是1024:
# 查看当前文件描述符限制
ulimit -n
# 典型输出:1024
对于开发服务器来说,这个值就太小了。当并发连接数上去后,系统就会开始拒绝服务。
二、必须检查的五大性能杀手
1. 文件描述符限制
这个我们刚才提到了。对于Web服务器来说,这个限制尤其致命。修改方法:
# 临时修改(重启失效)
ulimit -n 65535
# 永久修改,编辑/etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
2. 虚拟内存参数
默认的swappiness值(通常是60)会导致系统过早使用交换分区:
# 查看当前值
cat /proc/sys/vm/swappiness
# 临时修改
sysctl vm.swappiness=10
# 永久修改,编辑/etc/sysctl.conf
vm.swappiness=10
对于有充足内存的服务器,建议设为10以下。
3. TCP连接参数
默认的TIME_WAIT设置会导致高并发时端口耗尽:
# 查看当前TIME_WAIT连接数
ss -s | grep TIME-WAIT
# 优化参数
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_fin_timeout = 30" >> /etc/sysctl.conf
sysctl -p
4. 文件系统缓存
默认的文件系统缓存策略可能不适合你的工作负载:
# 查看当前缓存设置
sysctl -a | grep dirty
# 优化写入性能(适合数据库服务器)
echo "vm.dirty_background_ratio = 5" >> /etc/sysctl.conf
echo "vm.dirty_ratio = 10" >> /etc/sysctl.conf
5. 调度器选择
默认的I/O调度器可能不是最优选择:
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 修改为deadline调度器(适合数据库)
echo deadline > /sys/block/sda/queue/scheduler
三、实战:优化一个Web服务器
让我们以一个Nginx+PHP的Web服务器为例,演示完整的优化过程。
1. 基础系统检查
# 查看系统负载
uptime
# 检查内存使用
free -h
# 查看磁盘I/O
iostat -x 1
2. 针对性优化
# 优化网络连接
echo "net.core.somaxconn = 32768" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog = 8192" >> /etc/sysctl.conf
# 优化文件描述符
echo "fs.file-max = 2097152" >> /etc/sysctl.conf
# 优化PHP进程
# 编辑php-fpm.conf
pm.max_children = 100
pm.start_servers = 30
pm.min_spare_servers = 20
pm.max_spare_servers = 50
3. 验证优化效果
# 查看当前连接数
netstat -ant | awk '{print $6}' | sort | uniq -c | sort -n
# 压力测试
ab -n 10000 -c 100 http://localhost/
四、注意事项与进阶建议
优化不是万能的,这里有几个重要的注意事项:
不要盲目复制参数:别人的优化方案不一定适合你。比如数据库服务器和Web服务器的优化重点就完全不同。
循序渐进:一次只修改一个参数,测试效果后再决定是否保留。
监控很重要:优化前和优化后都要做好性能监控,推荐使用以下工具:
# 实时监控 htop iotop iftop # 日志分析 dmesg /var/log/syslog考虑硬件特性:SSD和机械硬盘的最佳参数是不同的,多核CPU和单核CPU的调度策略也应该区别对待。
内核版本差异:不同版本的Linux内核,参数的默认值和可调范围可能有变化。
对于进阶用户,还可以考虑:
- 使用
tuned工具集来自动化优化 - 编译自定义内核,去掉不需要的模块
- 使用cgroups来隔离关键进程的资源使用
五、总结回顾
通过今天的分享,我们了解了Linux系统性能下降的一个常见原因 - 默认内核参数的不合理配置。我们从文件描述符、虚拟内存、TCP连接、文件系统缓存和I/O调度器五个方面,详细分析了可能存在的性能瓶颈,并给出了具体的优化方案。
记住,系统优化是一门平衡的艺术。没有放之四海而皆准的最优解,只有最适合你当前工作负载的配置。建议你在实际应用中,结合监控数据,不断测试和调整,找到属于你的"黄金配置"。
最后送大家一个检查清单,下次遇到性能问题时可以按这个顺序排查:
- 检查系统负载(uptime)
- 检查内存使用(free)
- 检查磁盘I/O(iostat)
- 检查网络连接(netstat/ss)
- 检查进程资源占用(top/htop)
- 检查内核日志(dmesg)
希望这些经验能帮你驯服那只越来越慢的Linux系统!
评论