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)进行一次参数回滚并确认业务恢复正常。