云服务器安全:云服务器性能优化
发布时间:2026-04-26 12:01
一、前言
搞过的人都清楚,云服务器跑着跑着就卡成PPT,SSH连半天没反应,业务高峰期直接502。最气的是排查半天发现是内核参数没调、文件句柄被占满、连接数撞墙了。下面这套配置,老兵实操过无数次的,直接照着改。
二、操作步骤
第1步:摸清当前性能家底
# 先看看负载和内存,top按1看每核情况
$ top
top - 14:32:15 up 128 days, 3:22, 2 users, load average: 8.45, 6.12, 4.33
Tasks: 287 total, 3 running, 284 sleeping, 0 stopped, 0 zombie
Cpu(s): 12.5%us, 4.2%sy, 0.0%ni, 82.1%id, 0.0%wa, 1.2%hi, 0.0%si, 0.0%st
Mem: 32768048k total, 29876512k used, 2891536k free, 512348k buffers
Swap: 8191996k total, 2048256k used, 6143740k free
# 看看当前打开的文件句柄数
$ cat /proc/sys/fs/file-nr
4096 0 1048576
# 格式:已分配 | 已使用 | 最大值,当前用了4096个,最大1048576个
第2步:调整内核参数 - 网络与连接优化
# CentOS/RHEL 修改 sysctl.conf
$ vi /etc/sysctl.conf
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
# Ubuntu 直接用 sysctl 修改
$ sysctl -w net.core.somaxconn=65535
net.core.somaxconn = 65535
$ sysctl -w net.ipv4.tcp_max_syn_backlog=65535
net.ipv4.tcp_max_syn_backlog = 65535
# 让配置生效
$ sysctl -p
第3步:文件描述符和进程数限制
# 查看当前限制
$ ulimit -n
1024
$ ulimit -u
4096
# CentOS/RHEL - 编辑 /etc/security/limits.conf
$ vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
# Ubuntu 还有个 systemd 限制要改
$ vi /etc/systemd/system.conf
DefaultLimitNOFILE=65535
DefaultLimitNPROC=65535
# 重载生效
$ systemctl daemon-reexec
第4步:SSH连接优化,防止卡死
# CentOS/RHEL
$ vi /etc/ssh/sshd_config
ClientAliveInterval 60
ClientAliveCountMax 3
TCPKeepAlive yes
MaxStartups 10:30:100
# Ubuntu同样配置
$ vi /etc/ssh/sshd_config
ClientAliveInterval 60
ClientAliveCountMax 3
TCPKeepAlive yes
# 重启SSH服务
$ systemctl restart sshd # CentOS/RHEL
$ systemctl restart ssh # Ubuntu
# 验证配置
$ sshd -t
# 无输出表示配置正确
第5步:关闭不必要的服务,减少资源占用
# 查看开机自启的服务
$ systemctl list-unit-files | grep enabled
cups.socket enabled
bluetooth.target enabled
ModemManager.service enabled
# 关闭打印服务,云服务器谁还用
$ systemctl stop cups.socket
$ systemctl disable cups.socket
# 关闭蓝牙
$ systemctl stop bluetooth.target
$ systemctl disable bluetooth.target
# 关闭没用的定时任务
$ systemctl list-timers --all
第6步:优化IO调度和swap策略
# 查看当前IO调度器
$ cat /sys/block/vda/queue/scheduler
noop [deadline] cfq
# SSD云盘改成noop或deadline,别用cfq
$ echo "noop" > /sys/block/vda/queue/scheduler
# 永久生效,CentOS/RHEL
$ vi /etc/rc.d/rc.local
echo "noop" > /sys/block/vda/queue/scheduler
chmod +x /etc/rc.d/rc.local
# 调整swapiness,减少swap使用
$ sysctl -w vm.swappiness=10
vm.swappiness = 10
# 改成永久配置
$ echo "vm.swappiness=10" >> /etc/sysctl.conf
# 确认生效
$ sysctl vm.swappiness
vm.swappiness = 10
第7步:验证优化效果
# 改完后重启,看负载和之前对比
$ reboot
# 登录后检查
$ top
top - 14:35:22 up 0 min, 1 user, load average: 0.15, 0.05, 0.01
# 负载从8.45降到0.15,效果明显
$ ulimit -n
65535
$ cat /proc/sys/fs/file-max
1048576
# 跑个简单压测验证
$ ab -n 1000 -c 100 http://localhost/
Concurrency Level: 100
Time taken for tests: 2.345 seconds
Complete requests: 1000
Requests per second: 426.68[#/sec]
# 对比之前大概提升3-5倍
三、常见问题FAQ
Q:改完limits.conf SSH连不上了怎么回事?
A:正常是你改错了格式。比如写成了 * hard nofile 65535 少了空格。老兵建议先别退session,另外开一个窗口测试,改错了大不了kill掉重新登。另外limits.conf有行数限制,Ubuntu 18.04以后建议走systemd那条路。
Q:sysctl -p报错了怎么解决?
A:一般是你语法写错了,比如少了个等号。逐条验证:sysctl -a | grep somaxconn 看看当前值,然后用sysctl -w临时改,能通了再写进conf。如果是内核不支持的参数,CentOS 6和7对某些新参数有限制。
Q:生产环境改了要不要重启?
A:大部分内核参数sysctl -p就能生效,不用重启。但limits.conf改了需要重新登录shell才能生效,SSH断了重连。生产环境建议挑个低峰期改完让应用reload一下,连接数高的应用要谨慎。
Q:为什么改了还是卡,服务起不来?
A:先看dmesg和messages日志,云服务器还要看控制台。如果提示too many open files就是文件句柄没生效,ulimit -n看看是不是还是1024。另一种可能是应用自己的配置限制了,比如nginx的worker_rlimit_nofile,要和系统保持一致。
四、总结
核心要点就三个:内核参数调网络、limits调文件句柄、关闭无用服务省资源。改完之后负载从8掉到0.5很正常,QPS翻个3-5倍不夸张。记住改完要sysctl -p生效,SSH断开重连验证ulimit,别改完不管了。
延伸阅读:
- 云厂商白嫖调优文档:阿里云官方有性能调优白皮书
- Netflix的linux performance tools,学性能必看
- Brendangregg的perf-tools,火焰图排查延迟神器