Linux 默认内核参数面向通用场景,对于高并发电商必须针对性调整。以下配置需写入 /etc/sysctl.conf 并执行 sysctl -p 生效:
# 文件句柄限制
fs.file-max = 1000000
# TCP 连接优化
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0 # 关闭(NAT 环境下可能导致问题)
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
# 内存与交换
vm.swappiness = 10
vm.overcommit_memory = 1
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535同时调整进程最大打开文件数:ulimit -n 655350 并写入 /etc/security/limits.conf。这些参数能显著降低 TIME_WAIT 堆积,提升新建连接速率。
电商入口通常采用 Nginx 作为七层负载均衡,配合 Keepalived 实现 VIP 漂移,保障故障自动切换。
Nginx 核心配置(/etc/nginx/nginx.conf):
user nginx;
worker_processes auto; # 自动匹配CPU核心数
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
http {
upstream app_backend {
# 最少连接算法,适合长尾请求
least_conn;
server 192.168.1.10:8080 weight=5 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 weight=5 max_fails=3 fail_timeout=30s;
keepalive 64; # 连接池
}
server {
listen 80;
location / {
proxy_pass http://app_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_buffering off; # 减少延迟
proxy_cache_key "$scheme$request_method$host$request_uri";
}
# 静态资源由 Nginx 直接返回
location ~* \.(jpg|png|css|js)$ {
root /data/static;
expires 7d;
access_log off;
}
}
}Keepalived 主备配置(/etc/keepalived/keepalived.conf):
vrrp_instance VI_1 {
state MASTER # 备机为 BACKUP
interface eth0
virtual_router_id 51
priority 150 # 备机为 100
advert_int 1
authentication {
auth_type PASS
auth_pass secret
}
virtual_ipaddress {
192.168.1.100/24 dev eth0 label eth0:0
}
notify /usr/local/bin/notify.sh # 切换时触发告警
}健康检查通过 check_nginx.sh 脚本检测进程,异常时降低 priority 触发切换。
应用服务器(以 Java 为例)的 JVM 参数需与 Linux 内存管理协同:
# 启动参数(4核16G机器)
java -Xms8g -Xmx8g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 \
-XX:+ParallelRefProcEnabled -XX:+HeapDumpOnOutOfMemoryError \
-Djava.security.egd=file:/dev/./urandom \
-jar app.jar-Xms = -Xmx 避免堆动态伸缩带来的性能损耗。/dev/./urandom 替代 /dev/random,避免熵不足导致阻塞。同时,Linux 的 CPU 亲和性 绑定可提升缓存命中率,使用 taskset -c 0-3 java ... 将 JVM 绑定到特定核,减少上下文切换。
Redis 作为缓存和分布式会话存储,需调整 Linux 内存策略和 TCP backlog:
# /etc/sysctl.conf 追加
net.core.somaxconn = 65535
# Redis 配置(/etc/redis/redis.conf)
maxmemory 8gb
maxmemory-policy allkeys-lru
tcp-backlog 65535
timeout 300
tcp-keepalive 60使用 redis-benchmark 压测,若出现 Cannot allocate memory,需检查 vm.overcommit_memory = 1。同时启用 RDB + AOF 持久化,并配置主从复制,保证缓存层高可用。
MySQL 是电商系统最脆弱的一环。Linux 层面需调整 I/O 调度器(SSD 建议 noop 或 none):
echo noop > /sys/block/sda/queue/schedulerMySQL 配置(/etc/my.cnf)核心参数:
[mysqld]
# 缓冲池(设为物理内存的 70-80%)
innodb_buffer_pool_size = 12G
innodb_buffer_pool_instances = 8
# 日志优化
innodb_log_file_size = 2G
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 2 # 放宽持久性提升性能
# 连接与并发
max_connections = 2000
thread_cache_size = 256
table_open_cache = 4096
# 查询缓存(适用于读多写少,但注意失效开销)
query_cache_type = 0 # 高并发下建议关闭,避免锁争用此外,开启慢查询日志并设置 long_query_time=1,配合 pt-query-digest 分析慢 SQL。对订单表按时间分区,减少单表数据量。
秒杀场景下,请求先入 RabbitMQ 队列,应用异步消费。需调高 Linux 的文件描述符和内存映射区域:
# 增加 map 区域计数
echo 200000 > /proc/sys/vm/max_map_countRabbitMQ 配置文件(/etc/rabbitmq/rabbitmq.conf):
vm_memory_high_watermark.relative = 0.7
disk_free_limit.relative = 1.0
tcp_listen_options.backlog = 4096同时设置 ulimit -n 100000 启动 RabbitMQ 服务。
所有服务器部署 Prometheus Node Exporter + cAdvisor 监控系统指标和容器状态。关键报警规则:
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.2 → 内存告警。node_load1 > core_count * 0.8 → CPU 过载。mysql_global_status_threads_running > 100 → 数据库连接风暴。基于 Prometheus 指标结合 Keda 或 Horizontal Pod Autoscaler 实现应用实例的动态伸缩,应对流量波动。
使用 JMeter 或 wrk 压测全链路。重点观察:
TIME_WAIT 是否快速回收(net.ipv4.tcp_tw_reuse 生效)。Innodb_rows_read 和 Innodb_buffer_pool_hit_rate 是否 > 99%。根据压测结果调整 worker_connections、innodb_io_capacity 等参数,逐步逼近硬件极限。
本文从 Linux 内核调优出发,逐层深入到 Nginx、Redis、MySQL 和消息队列,构建了一套完整的电商高并发架构。真正的性能瓶颈往往不在代码,而在操作系统层面被忽略的默认参数。掌握 sysctl、ulimit、/proc 调优,以及各中间件的 Linux 适配配置,是架构师必备的底层能力。这套方案已在若干中型电商平台落地,支撑过日均 500 万订单的峰值流量。代码与配置皆为生产级,可结合自身业务直接裁剪使用。最终,架构的韧性源于每一行内核参数和配置项的精心打磨。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。