1.
概述与环境准备
- 目标:低延迟、高可用的企业级应用部署。
- 环境检查:确认VPS带宽/延迟、CPU、内存、磁盘类型(SSD)和IOPS;命令示例:ssh root@ip "lscpu; free -h; lsblk; ethtool eth0".
- 建议:至少2个节点+1个负载层,生产建议使用弹性公网IP与私网连接。
2.
系统级优化(内核与网络)
- 临时生效命令:echo 100000 > /proc/sys/fs/file-max; sysctl -w net.core.somaxconn=65535; sysctl -w vm.swappiness=10.
- 永久设置:在 /etc/sysctl.d/99-custom.conf 中添加:net.core.somaxconn=65535, net.ipv4.tcp_tw_reuse=1, net.ipv4.ip_local_port_range=10240 65535, net.ipv4.tcp_fin_timeout=30, net.ipv4.tcp_max_syn_backlog=4096, net.ipv4.tcp_congestion_control=bbr。然后执行 sysctl --system。
- 启用BBR:echo "tcp_bbr" > /etc/modules-load.d/bbr.conf; modprobe tcp_bbr; 检查 sysctl net.ipv4.tcp_congestion_control。
3.
文件描述符与用户限制
- 临时:ulimit -n 100000。
- 永久:在 /etc/security/limits.d/90-nofile.conf 添加:* soft nofile 100000; * hard nofile 100000。
- 系统服务(systemd)也需设置,编辑 /etc/systemd/system.conf 和 /etc/systemd/user.conf,调整 DefaultLimitNOFILE=100000,然后 systemctl daemon-reexec。
4.
磁盘与IO优化
- 推荐:使用SSD并设置分区对齐,文件系统选择XFS或ext4,挂载时加上 noatime,nodiratime。
- 调整IO调度器:echo noop > /sys/block/sda/queue/scheduler 或使用 mq-deadline;对数据库盘推荐 noop 或 deadline。
- MySQL/数据库建议设置 innodb_flush_method=O_DIRECT 减少页缓存争用,innodb_io_capacity 根据磁盘IOPS调整。
5.
Nginx作为反向代理与静态加速
- 基础配置示例:worker_processes auto; worker_rlimit_nofile 100000; events { use epoll; worker_connections 65535; }。
- http模块优化:sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 15; client_max_body_size 100M; fastcgi_buffers 16 16k。
- 上游配置:upstream backend { least_conn; server 10.0.0.2:8080 max_fails=3 fail_timeout=5s; server 10.0.0.3:8080 max_fails=3 fail_timeout=5s; keepalive 32; }
6.
应用层(如Python/Java)调优实践
- Python Gunicorn:workers = 2*CPU+1,示例:gunicorn app:app -w 9 -k gevent --worker-connections 1000 --timeout 30。
- Java JVM:设置 -Xms=Xmx=内存的70%-80%,使用G1GC:-XX:+UseG1GC -XX:MaxGCPauseMillis=200。
- 连接池:对数据库和外部服务设置合理的最大连接数,避免线程/协程阻塞。
7.
数据库(MySQL/Postgres)性能调整
- MySQL示例:在 my.cnf 中设置 innodb_buffer_pool_size=0.7*RAM,innodb_log_file_size=512M,innodb_flush_method=O_DIRECT,max_connections 根据并发调整(如500)。
- 慢查询分析:启用慢查询日志,使用 pt-query-digest 分析并添加索引或重写SQL。
- 读写分离:主从复制+读库负载分担,使用中间件或应用层路由。
8.
缓存层(Redis / Memcached)配置要点
- Redis生产建议:关闭swap、设置 maxmemory 和 maxmemory-policy (volatile-lru 或 allkeys-lru),持久化按需求选择 RDB/AOF,缓存服务器最好走私网。
- 示例:redis.conf 中 appendonly no(若仅作缓存),maxmemory 4gb,maxmemory-policy allkeys-lru。
- 集群/哨兵:使用Redis Sentinel或Cluster保证可用性与分片。
9.
负载均衡与高可用架构实战
- L4/L7选择:使用 HAProxy 或 Nginx 做HTTP/HTTPS负载均衡,LVS 用于超高并发场景。
- HAProxy 基本配置:frontend http-in bind *:80 default_backend app; backend app balance roundrobin server app1 10.0.0.2:8080 check; server app2 10.0.0.3:8080 check.
- 使用 Keepalived 做 VRRP 主备切换:配置 vrrp_instance 与 notify 脚本,实现IP漂移与故障转移。
10.
会话粘滞与一致性哈希
- 无状态优先:尽量把session放到Redis,避免粘滞。
- 若必须粘滞:Nginx 可用 ip_hash 或 cookie; HAProxy 用 cookie 或 balance source。
- 一致性哈希用于缓存分片或CDN,减少热数据迁移。
11.
监控、压测与持续优化
- 压测工具:wrk, ab, sieger,示例:wrk -t12 -c400 -d60s http://ip:80。
- 监控栈:Prometheus + node_exporter + mysqld_exporter + Grafana,设置报警(CPU、load、响应时间、错误率)。
- 日志集中:ELK 或 Loki 收集并建立日志告警,如高频错误触发告警。
12.
安全与运维注意事项
- 基本安全:禁用root SSH登录,使用密钥认证,配置防火墙(ufw/iptables)只开放必要端口。
- 备份:数据库定期冷备/增量,配置自动化脚本并做异地备份;恢复演练必不可少。
- 运维自动化:使用 Ansible/Chef 做配置管理与一键回滚。
13.
问:在柬埔寨VPS上如何保证低延迟网络?
14.
答:
- 做法:选择就近节点与带有优质骨干网的机房,启用私网通信降低公网跳数;在系统层开启BBR、调节 tcp 参数并使用CDN分发静态资源。同时使用keepalive和连接池减少握手开销。
15.
问:在资源有限的VPS上如何实现高可用?
16.
答:
- 做法:采用轻量级HA方案:两台应用节点+一台负载均衡(或三节点Keepalived双主),数据库采用主从或使用云DB,关键数据放在外部托管服务(如RDS/托管Redis),并保证自动化恢复脚本与备份策略。
17.
问:上线前如何验证负载均衡配置与性能?
18.
答:
- 验证步骤:1) 在离线环境用 wrk/ab 做压测,逐步增加并发观察错误与延迟;2) 验证切换:模拟节点宕机,看Keepalived/HAProxy是否快速切换;3) 通过Prometheus/Grafana观察资源、连接数和QPS趋势,修正连接池与超时设置。
来源:企业级应用在vps柬埔寨上的性能调优与负载均衡实践