如何通过lnmp优化CentOS数据库,精准提升网站性能?
- 内容介绍
- 文章标签
- 相关推荐
为什么网站会变慢?——使用者痛点直击
访问卡顿、页面加载时间长、高峰期出现502/504错误、数据库查询超时导致业务中断…,这些都是运维和开发最头疼的痛点。不过,
LNMP 环境基础调整——从程序到服务层稳住根基
# 减少 swap 使用,让更多内存留给数据库 vm.swappiness=10 # 脏页刷新阈值。避免突发 I/O 峰值 vm.dirty_background_ratio=5 vm.dirty_ratio=15 # TCP 连接复用与 TIME_WAIT 快速回收 net.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_tw_recycle=0 # 在 NAT 环境下慎用 net.ipv4.tcp_fin_timeout=15 net.ipv4.tcp_keepalive_time=600 net.ipv4.tcp_keepalive_intvl=60 net.ipv4.tcp_keepalive_probes=5 # 增加本地端口范围,支持高并发短连接 net.ipv4.ip_local_port_range=1024 65535 # 增加最大文件打开数 fs.file-max=6815744 # 应更改后立即生效 sysctl -p这些参数直接缓解了“内存不足导致频繁swap”和“TCP连接耗尽引起请求超时”的使用者痛点。
2. Nginx 高并发调优
worker_processes auto;# 自动匹配 CPU 主要数 worker_connections 65536;# 每个工作进程可处理的最大连接数 multi_accept on;# 一次接受所有新连接 use epoll;# 高效事件模型 keepalive_timeout 65;# 长连接复用,减少握手开销 keepalive_requests 100;# 每条长连接最多处理请求数 gzip on;gzip_min_length 1k;gzip_buffers 4 16k;不过,gzip_comp_level 6;gzip_types text/plain application/xml application/json text/css application/javascript;# 防止慢客户端占满连接池 client_body_timeout 10s;client_header_timeout 10s;send_timeout 10s;怎么说呢,通过增大 worker_connections 和启用长连接。可显著降低 “高峰期服务器返回 502” 的概率。老实说,
PHP‑FPM 参数调校
pm = dynamic # 动态进程池,按需伸缩 pm.max_children = $ # 最多子进程数,依据 CPU 内核乘以系数控制内存使用 pm.start_servers = $ pm.min_spare_servers = $ pm.max_spare_servers = $ pm.max_requests = 500 # 防止内存泄漏。 定期回收子进程 request_terminate_timeout = 90s # 长时间请求自动杀死,避免僵尸进程占用资源 php_admin_value = 96M # 每个 PHP 脚本可使用的内存上限,防止单个脚本耗光资源 php_flag = off # 生产环境关闭错误输出,减少不必要的 I/O合理设置 max_children 能够避免 “并发请求过多导致 PHP‑FPM 内存爆炸” 的常见场景。
数据库层面深度调整:从慢查询到硬件配套 慢查询定位与索引调整 慢查询是导致页面卡顿的首要因素。通过以下步骤快速定位并消除瓶颈:
- 开启慢查询日志:
slow_query_log = ON // my.cnf 中 区段添加或修改此项,slow_query_log_file = /var/log/mysql/slow.log,long_query_time = // 若超过此阈值则记录。log_queries_not_using_indexes // 额外记录未走索引的语句.- 分析日志的观点是,
pt-query-digest /var/log/mysql/slow.log --limit%//%//%//%- 基于 EXPLAIN 添加或调整索引: - 对 WHERE、JOIN、ORDER BY 常见列建立合适的 B‑Tree 或全文索引。- 对经常组合使用的列考虑复合索引。- 大表分区或归档历史数据,降低单表扫描成本。
使用者最直观感受是“打开某个商品详情页需要等待几秒”,通过上述手段可把响应时间压到毫秒级。
InnoDB Buffer Pool &内存分配策略 ) Buffer Pool 是 MySQL 性能的“心脏”。若太小会频繁触发磁盘 I/O;若太大又可能导致程序 swap。下面给出通用配置示例: ) ) ini innodb_buffer_pool_size = {{ total_mem * GiB * %%% }} // %%% innodb_log_file_size = {{ innodb_buffer_pool_size * %%% }} // %%% innodb_io_capacity = {{ ssd_iops_if_possible_or_hdd_default }} innodb_io_capacity_max = {{ ssd_iops_if_possible_or_hdd_default * %%% }} SSD 推荐 `innodb_io_capacity` 达到 **SSD 名义 IOPS 的 %**,HDD 建议保持 **%**。) ) `innodb_lru_scan_depth` 在高并发写入场景下可适当降低,以减少后台刷新开销。) ) `innodb_adaptive_hash_index` 对读密集型业务有正向收益;写入密集时可以关闭以减少锁竞争。) ) ini innodb_adaptive_hash_index={{ enable_if_read_heavy|else|disable }} ) ) `
` ` `` `磁盘 I/O &持久化介质` `:` `SSD + RAID ` `+` ` `。` ` `
- ` `主库推荐看看 **RAID **,从库视业务容忍度可选 **RAID **、**RAID ** 或 **RAID **。` `/li>` ` `
- ` `文件程序选择 **ext4** 或 **XFS**。并在挂载选项中加入 `noatime,nodiratime`,减少每次读取都更新访问时间的无谓写入。` `/li>` ` `
- ` `定期运行 fstrim或 e4defrag/ xfs_fsr 检测碎片,保持顺序读写效率。` `/li>` ` `ul>` ` div>` ` `"network-tuning"` `"硬件&网络层提高"` ` `"tcp-bonding"` `"TCP 参数及多网卡绑定 "` `"pre"` `# /etc/sysconfig/network-scripts/ifcfg-bond-example ` DEVICE=bondedbyexample: TYPE=bondedbyexample: BONDING_MASTER=yes: BONDING_MODE= # active-backup for fault tolerance or balance-rr for throughput,adjust according to switch support. BONDING_SLES= eth eth: # BOOTPROTO= 至于none。ONBOOT= yes: # NM_CONTROLLED= no: # `# Slave interfaces` DEVICE=`eth` MASTER=`bondedbyexample` SLE=`yes` BOOTPROTO=`none` ONBOOT=`yes` `# Apply bonding module options if needed ` options bonding mode=`miimon=` downdelay=` updelay=` `# TCP sysctl tweaks ` net.core.somaxconn = net.core.netdev_max_backlog = net.ipv4.tcp_max_syn_backlog = net.ipv4.tcp_syncookies = net.ipv4.tcp_tw_reuse = net.ipv4.tcp_fin_timeout = net.ipv4.tcp_keepalive_time = net.ipv4.tcp_keepalive_intvl = net.ipv4.tcp_keepalive_probes = net.ipvip.route.flush = vm.min_free_kbytes = vm.extra_free_kbytes = vm.swappiness= vm.dirty_background_ratio= vm.dirty_ratio= fs.file-max= kernel.pid_max= fs.nr_open= sysctl -p "pre" "para" "启用 bond”后 "实际吞吐量可达单块网卡带宽的×倍," "同时提供链路冗余;" "配合上面的 TCP 参数,"可显著降低 " "高并发场景下的丢包与重传"。"从而缓解" "\"访问偶尔出现超时或页面半加载\" " "" "" "" "" "" "" "" "" "" ""
"" "" "" "" "" "" "" "" "" "" """ """ """ """ """ """ """ """ """ """ """ """ """ """ """
""" """
""" """ """
""" """ """ """ """ """
""" """"""""""""""""""""""""
为什么网站会变慢?——使用者痛点直击
访问卡顿、页面加载时间长、高峰期出现502/504错误、数据库查询超时导致业务中断…,这些都是运维和开发最头疼的痛点。不过,
LNMP 环境基础调整——从程序到服务层稳住根基
# 减少 swap 使用,让更多内存留给数据库 vm.swappiness=10 # 脏页刷新阈值。避免突发 I/O 峰值 vm.dirty_background_ratio=5 vm.dirty_ratio=15 # TCP 连接复用与 TIME_WAIT 快速回收 net.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_tw_recycle=0 # 在 NAT 环境下慎用 net.ipv4.tcp_fin_timeout=15 net.ipv4.tcp_keepalive_time=600 net.ipv4.tcp_keepalive_intvl=60 net.ipv4.tcp_keepalive_probes=5 # 增加本地端口范围,支持高并发短连接 net.ipv4.ip_local_port_range=1024 65535 # 增加最大文件打开数 fs.file-max=6815744 # 应更改后立即生效 sysctl -p这些参数直接缓解了“内存不足导致频繁swap”和“TCP连接耗尽引起请求超时”的使用者痛点。
2. Nginx 高并发调优
worker_processes auto;# 自动匹配 CPU 主要数 worker_connections 65536;# 每个工作进程可处理的最大连接数 multi_accept on;# 一次接受所有新连接 use epoll;# 高效事件模型 keepalive_timeout 65;# 长连接复用,减少握手开销 keepalive_requests 100;# 每条长连接最多处理请求数 gzip on;gzip_min_length 1k;gzip_buffers 4 16k;不过,gzip_comp_level 6;gzip_types text/plain application/xml application/json text/css application/javascript;# 防止慢客户端占满连接池 client_body_timeout 10s;client_header_timeout 10s;send_timeout 10s;怎么说呢,通过增大 worker_connections 和启用长连接。可显著降低 “高峰期服务器返回 502” 的概率。老实说,
PHP‑FPM 参数调校
pm = dynamic # 动态进程池,按需伸缩 pm.max_children = $ # 最多子进程数,依据 CPU 内核乘以系数控制内存使用 pm.start_servers = $ pm.min_spare_servers = $ pm.max_spare_servers = $ pm.max_requests = 500 # 防止内存泄漏。 定期回收子进程 request_terminate_timeout = 90s # 长时间请求自动杀死,避免僵尸进程占用资源 php_admin_value = 96M # 每个 PHP 脚本可使用的内存上限,防止单个脚本耗光资源 php_flag = off # 生产环境关闭错误输出,减少不必要的 I/O合理设置 max_children 能够避免 “并发请求过多导致 PHP‑FPM 内存爆炸” 的常见场景。
数据库层面深度调整:从慢查询到硬件配套 慢查询定位与索引调整 慢查询是导致页面卡顿的首要因素。通过以下步骤快速定位并消除瓶颈:
- 开启慢查询日志:
slow_query_log = ON // my.cnf 中 区段添加或修改此项,slow_query_log_file = /var/log/mysql/slow.log,long_query_time = // 若超过此阈值则记录。log_queries_not_using_indexes // 额外记录未走索引的语句.- 分析日志的观点是,
pt-query-digest /var/log/mysql/slow.log --limit%//%//%//%- 基于 EXPLAIN 添加或调整索引: - 对 WHERE、JOIN、ORDER BY 常见列建立合适的 B‑Tree 或全文索引。- 对经常组合使用的列考虑复合索引。- 大表分区或归档历史数据,降低单表扫描成本。
使用者最直观感受是“打开某个商品详情页需要等待几秒”,通过上述手段可把响应时间压到毫秒级。
InnoDB Buffer Pool &内存分配策略 ) Buffer Pool 是 MySQL 性能的“心脏”。若太小会频繁触发磁盘 I/O;若太大又可能导致程序 swap。下面给出通用配置示例: ) ) ini innodb_buffer_pool_size = {{ total_mem * GiB * %%% }} // %%% innodb_log_file_size = {{ innodb_buffer_pool_size * %%% }} // %%% innodb_io_capacity = {{ ssd_iops_if_possible_or_hdd_default }} innodb_io_capacity_max = {{ ssd_iops_if_possible_or_hdd_default * %%% }} SSD 推荐 `innodb_io_capacity` 达到 **SSD 名义 IOPS 的 %**,HDD 建议保持 **%**。) ) `innodb_lru_scan_depth` 在高并发写入场景下可适当降低,以减少后台刷新开销。) ) `innodb_adaptive_hash_index` 对读密集型业务有正向收益;写入密集时可以关闭以减少锁竞争。) ) ini innodb_adaptive_hash_index={{ enable_if_read_heavy|else|disable }} ) ) `
` ` `` `磁盘 I/O &持久化介质` `:` `SSD + RAID ` `+` ` `。` ` `
- ` `主库推荐看看 **RAID **,从库视业务容忍度可选 **RAID **、**RAID ** 或 **RAID **。` `/li>` ` `
- ` `文件程序选择 **ext4** 或 **XFS**。并在挂载选项中加入 `noatime,nodiratime`,减少每次读取都更新访问时间的无谓写入。` `/li>` ` `
- ` `定期运行 fstrim或 e4defrag/ xfs_fsr 检测碎片,保持顺序读写效率。` `/li>` ` `ul>` ` div>` ` `"network-tuning"` `"硬件&网络层提高"` ` `"tcp-bonding"` `"TCP 参数及多网卡绑定 "` `"pre"` `# /etc/sysconfig/network-scripts/ifcfg-bond-example ` DEVICE=bondedbyexample: TYPE=bondedbyexample: BONDING_MASTER=yes: BONDING_MODE= # active-backup for fault tolerance or balance-rr for throughput,adjust according to switch support. BONDING_SLES= eth eth: # BOOTPROTO= 至于none。ONBOOT= yes: # NM_CONTROLLED= no: # `# Slave interfaces` DEVICE=`eth` MASTER=`bondedbyexample` SLE=`yes` BOOTPROTO=`none` ONBOOT=`yes` `# Apply bonding module options if needed ` options bonding mode=`miimon=` downdelay=` updelay=` `# TCP sysctl tweaks ` net.core.somaxconn = net.core.netdev_max_backlog = net.ipv4.tcp_max_syn_backlog = net.ipv4.tcp_syncookies = net.ipv4.tcp_tw_reuse = net.ipv4.tcp_fin_timeout = net.ipv4.tcp_keepalive_time = net.ipv4.tcp_keepalive_intvl = net.ipv4.tcp_keepalive_probes = net.ipvip.route.flush = vm.min_free_kbytes = vm.extra_free_kbytes = vm.swappiness= vm.dirty_background_ratio= vm.dirty_ratio= fs.file-max= kernel.pid_max= fs.nr_open= sysctl -p "pre" "para" "启用 bond”后 "实际吞吐量可达单块网卡带宽的×倍," "同时提供链路冗余;" "配合上面的 TCP 参数,"可显著降低 " "高并发场景下的丢包与重传"。"从而缓解" "\"访问偶尔出现超时或页面半加载\" " "" "" "" "" "" "" "" "" "" ""
"" "" "" "" "" "" "" "" "" "" """ """ """ """ """ """ """ """ """ """ """ """ """ """ """
""" """
""" """ """
""" """ """ """ """ """
""" """"""""""""""""""""""""

