服务公告

服务公告 > 综合新闻 > 云服务器安全:云服务器性能优化

云服务器安全:云服务器性能优化

发布时间: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,火焰图排查延迟神器