服务器性能优化
在日常开发中如果需要进行服务器性能优化大概有哪些切入点,例客户端请求服务器一个业务接口,可以优化的对象有Linux,nginx,phpfpm,php,mysql,redis;
- linux 可以优化配置服务器可以连接的套接字文件进程数
/etc/sysctl.conf
# 系统最大文件句柄数(所有进程可打开的文件总数上限)
fs.file-max = 1000000
# 系统范围内已分配、未使用的文件句柄数(监控用,一般不直接设置)
# fs.file-nr
# 端口范围
net.ipv4.ip_local_port_range = 1024 65535
# TCP连接相关
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog = 50000
# TIME-WAIT优化(高并发场景)
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.tcp_fin_timeout = 30
- nginx
# ============ 全局配置部分 ============
user nginx; # 确保与系统用户一致
worker_processes auto; # 自动设置为CPU核心数
worker_rlimit_nofile 65535; # 每个worker进程的文件描述符限制
# 事件模型(Linux下必须用epoll)
events {
worker_connections 65535; # 单个worker最大连接数
use epoll; # Linux高效事件模型
multi_accept on; # 一次accept多个连接
accept_mutex off; # 高并发时关闭锁,提升性能
}
# ============ HTTP配置部分 ============
http {
# 基础优化
sendfile on; # 启用零拷贝传输
tcp_nopush on; # 优化数据包发送
tcp_nodelay on; # 禁用Nagle算法
keepalive_timeout 65; # 长连接超时
keepalive_requests 1000; # 单个长连接最大请求数
types_hash_max_size 2048;
client_max_body_size 100m; # 根据需求调整
# 连接限制区(按需配置)
limit_conn_zone $binary_remote_addr zone=per_ip:10m;
limit_conn_zone $server_name zone=per_server:10m;
# 文件描述符缓存(静态文件优化)
open_file_cache max=10000 inactive=30s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# MIME类型
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main buffer=32k flush=5s;
error_log /var/log/nginx/error.log warn;
# Gzip压缩
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 包含虚拟主机配置
include /etc/nginx/conf.d/*.conf;
}
- phpfpm
[www]
user = www-data
group = www-data
listen = /var/run/php-fpm.sock
; 或 listen = 127.0.0.1:9000
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
listen.backlog = 65535
pm = dynamic
pm.max_children = 200 ; 计算:内存限制 × 子进程数 < 总内存
pm.start_servers = 30
pm.min_spare_servers = 20
pm.max_spare_servers = 50
pm.process_idle_timeout = 10s
pm.max_requests = 500 ; 预防内存泄漏
; 每个请求的内存限制
php_admin_value[memory_limit] = 128M
; 输出缓冲
php_admin_value[output_buffering] = 4096
注意配置不是越高越好,需要根据具体服务器配置和内存空间配置对应的处理进程数
- opcache
[opcache]
; 开启OPcache
opcache.enable=1
; CLI环境是否启用(开发环境建议1,生产建议0)
opcache.enable_cli=0
; 共享内存大小,单位MB(根据项目大小调整)
; 计算公式:所有PHP文件总大小 × 1.1
opcache.memory_consumption=256
; 字符串驻留内存,单位MB(PHP 7.0+)
opcache.interned_strings_buffer=16
; 最大缓存文件数(文件数量 × 1.1)
opcache.max_accelerated_files=20000
; 内存"浪费"百分比,达到此值会重启
opcache.max_wasted_percentage=10
; 检查文件时间戳的频率(秒),0表示不检查
; 开发环境:2,生产环境:0 + 手动重启
opcache.revalidate_freq=0
; 是否验证时间戳(生产环境必须设为0)
opcache.validate_timestamps=0
; 启用快速关闭
opcache.fast_shutdown=1
- php
- php中间件层根据 ip 和请求 api ,在 redis zset中配置滑动窗口限流,超过指定的 api 请求次数则 return error
- phpapi 中对所有 mysql 查询请求增加一层 redis 数据 cache 过滤,所有请求先请求到 cache 层,cache没有命中再请求 mysql 数据查询
- mysql
- 配置 mysql 主从读写分离,query查询走从节点,强关联查询走 master
- mysql 冷热数据分离, 冷数据从热库中移除,业务需要时指定冷库查询数据
- mysql 分库分表,将大体量单体数据库拆分为多个小体量mysql小集群
- 监控优化慢查询 sql
- redis
- redis 集群分片
- 大批量的循环操作则配置管道
- 控制大 key 和热 key 体积
- redis 服务器压力监控预警机制
- 部分可以延迟不一致的数据可以搭配本地文件缓存,缓解redis查询压力
- 定期清理过期,不再使用的 key
vjmsmhzsusduurpugqxyqzoukyipzt