服务器性能优化

服务器性能优化

在日常开发中如果需要进行服务器性能优化大概有哪些切入点,例客户端请求服务器一个业务接口,可以优化的对象有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

1 thought on “服务器性能优化”

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top