14.9.7 资源限制与系统参数调优
在高并发与多租户场景下,合理的资源限制与系统参数调优是保障ProxySQL稳定性与性能的关键。本节围绕CPU、内存、文件句柄、网络栈与磁盘I/O等维度给出可操作的调优策略,并配套示例、排错与练习。
1. 进程与线程资源限制#
目标:防止FD耗尽、线程过多导致上下文切换、连接数失控。
安装与依赖检查(以systemd为例):
# 安装工具
sudo yum install -y psmisc lsof sysstat
# 查看ProxySQL服务
systemctl status proxysql
配置示例:提高文件句柄与进程限制
路径:/etc/systemd/system/proxysql.service.d/limits.conf
[Service]
LimitNOFILE=1048576
LimitNPROC=65535
加载与验证:
sudo systemctl daemon-reload
sudo systemctl restart proxysql
cat /proc/$(pidof proxysql)/limits | egrep "open files|process"
命令解释:
- LimitNOFILE:进程可打开文件句柄上限,避免连接激增导致FD耗尽。
- LimitNPROC:可创建的最大进程/线程数量。
ProxySQL线程与连接上限设置示例(运行在管理端口 6032):
mysql -uadmin -padmin -h127.0.0.1 -P6032 <<'EOF'
SELECT @@mysql-threads, @@mysql-max_connections;
SET mysql-threads=8;
SET mysql-max_connections=2000;
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
EOF
排错:
# 查看FD使用情况
ls -l /proc/$(pidof proxysql)/fd | wc -l
# Too many open files错误排查
journalctl -u proxysql | tail -n 50
练习:
1)将LimitNOFILE调整为262144并观察FD上限变化。
2)使用压测工具连接1000并发,观察mysql-max_connections阈值行为。
2. 内存与缓存相关调优#
目标:避免Swap、稳定路由与统计表内存。
内存与Swap检查:
free -m
swapon --show
禁用/降低Swap倾向(临时与持久):
# 临时
sudo sysctl -w vm.swappiness=10
# 持久
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
ProxySQL内存与缓存示例:
mysql -uadmin -padmin -h127.0.0.1 -P6032 <<'EOF'
SELECT @@query_cache_size_MB, @@query_cache_limit_MB;
SET query_cache_size_MB=64;
SET query_cache_limit_MB=2;
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
EOF
排错:
# 查看内存占用
pmap -x $(pidof proxysql) | tail -n 10
# 是否发生OOM
dmesg | grep -i oom | tail -n 5
练习:
1)将query_cache_size_MB调至0并观察延迟变化。
2)将vm.swappiness设置为1,监控Swap使用是否下降。
3. 网络与连接参数优化#
目标:改善短连接、高并发下的TIME_WAIT与缓冲区问题。
内核网络参数示例(/etc/sysctl.conf):
net.core.somaxconn=1024
net.ipv4.tcp_fin_timeout=10
net.ipv4.tcp_tw_reuse=1
net.core.netdev_max_backlog=5000
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
加载:
sudo sysctl -p
连接保活与超时设置(ProxySQL):
mysql -uadmin -padmin -h127.0.0.1 -P6032 <<'EOF'
SELECT @@mysql-connect_timeout_server, @@mysql-connection_timeout;
SET mysql-connect_timeout_server=3000;
SET mysql-connection_timeout=3600000;
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
EOF
排错:
# TIME_WAIT统计
ss -s | grep -i timewait
# 连接积压
ss -lntp | grep 6033
练习:
1)将tcp_fin_timeout调整为5并观察TIME_WAIT变化。
2)观察mysql-connection_timeout变化对空闲连接数量的影响。
4. 磁盘与日志写入优化#
目标:降低I/O竞争与日志压力。
日志目录独立挂载示例:
# 假设新磁盘 /dev/vdb
sudo mkfs.xfs /dev/vdb
sudo mkdir -p /var/lib/proxysql
sudo mount /dev/vdb /var/lib/proxysql
# 持久化挂载
echo "/dev/vdb /var/lib/proxysql xfs defaults 0 0" | sudo tee -a /etc/fstab
日志级别调优(ProxySQL):
mysql -uadmin -padmin -h127.0.0.1 -P6032 <<'EOF'
SELECT @@mysql-eventslog_default_log;
SET mysql-eventslog_default_log=0; -- 0禁用,1启用
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
EOF
日志轮转示例(/etc/logrotate.d/proxysql):
/var/lib/proxysql/proxysql.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
排错:
# 磁盘I/O
iostat -x 1 5
# 目录空间
df -h /var/lib/proxysql
练习:
1)开启/关闭事件日志,比较I/O变化。
2)将日志轮转改为hourly观察日志大小变化。
5. 内核参数与系统级优化#
目标:整体吞吐与稳定性。
CPU调度与NUMA检查:
lscpu | egrep "NUMA|CPU\(s\)"
建议:禁用不必要服务:
systemctl list-unit-files --state=enabled
sudo systemctl disable --now firewalld
I/O调度器查看与设置:
cat /sys/block/vda/queue/scheduler
echo mq-deadline | sudo tee /sys/block/vda/queue/scheduler
排错:
# 查看软中断占用
mpstat -P ALL 1 3
# 内核消息
dmesg | tail -n 20
练习:
1)切换I/O调度器,观察iostat中await变化。
2)禁用一项不必要服务,检查CPU空闲提升。
6. 调优验证与持续优化#
基线采集:
# 运行前采集
sar -u 1 5
sar -n DEV 1 5
压力测试示例(使用 sysbench 对后端MySQL,验证ProxySQL):
# 安装
sudo yum install -y sysbench
# 准备
sysbench oltp_read_write \
--mysql-host=127.0.0.1 --mysql-port=6033 \
--mysql-user=sbtest --mysql-password=sbtest \
--tables=4 --table-size=100000 prepare
# 压测
sysbench oltp_read_write \
--mysql-host=127.0.0.1 --mysql-port=6033 \
--mysql-user=sbtest --mysql-password=sbtest \
--threads=64 --time=60 run
# 清理
sysbench oltp_read_write \
--mysql-host=127.0.0.1 --mysql-port=6033 \
--mysql-user=sbtest --mysql-password=sbtest cleanup
排错与回滚:
# 对比ProxySQL变量
mysql -uadmin -padmin -h127.0.0.1 -P6032 -e "SELECT * FROM runtime_global_variables"
# 回滚恢复
mysql -uadmin -padmin -h127.0.0.1 -P6032 -e "LOAD MYSQL VARIABLES FROM DISK; LOAD MYSQL VARIABLES TO RUNTIME;"
练习:
1)建立“调优前/后”吞吐对比表(QPS、P95延迟、CPU、FD)。
2)进行一次参数回滚并确认业务恢复正常。