一、CPU
1.1 关注指标
- CPU 使用率
- 平均负载
- 上下文切换次数
- CPU缓存
1.2 优化方案
- CPU绑定,CPU独占,减少调度导致的上下文切换
- 中断负载均衡,开启smp_affinity和irqbalance,把中断均衡到多个CPU上
- CPU资源限制,防止单进程占用过多CPU
二、内存
2.1 关注指标
- 已使用内存,剩余内存,可用内存
- 缓存和缓存区
- SWAP
- 缺页中断
2.2 优化
- 禁用SWAP,避免SWAP带来的额外IO,导致内存访问慢的问题
- 内存限制,防止单进程占用过多内存
- 使用大页或内存池,减少内存动态分配
三、文件系统和磁盘
3.1 关注指标
文件系统
- 存储使用率
- inode使用率
- 缓存
- 页缓存
- 目录项缓存
- inode缓存
- 文件系统缓存
磁盘
- IOPS
- 吞吐量
- 延迟
- IO使用率
3.2 优化
- ssd代替hdd,或者使用Raid,提升I/O性能
- 合适的IO调度算法
- 优化文件系统和磁盘的缓存和缓冲区,比如脏页刷新频率
四、网络

4.1 关注指标
- 使用率
- 吞吐
- pps
- 延迟
- 丢包数
- 重试数
- 连接数
4.2 优化
链路层
链路层主要处理MAC寻址(ARP RARP),错误帧测,网络帧的传输。
中断配置CPU亲和性(smp_affinity)或开启irqbalance
使用traffic control流量控制,为不同的网络流量配置Qos。
IP层
从路由和转发的角度,查看一下内核参数
net.ipv4.ip-forward=1 # 开启IP转发
net.ipv4.ip_default_ttl=64 # 生存周期TTL
net.ipv4.conf.eth0.rp_filter=1 # 地址方向校验,防止IP欺骗
其次查看mtu大小,以太网默认是1500
ifconfig
从ICMP角度看
net.ipv4.icmp_echo_ignore_all
net.ipv4.icmp_echo_ignore_broadcasts
TCP层
如果timeout比较多,可以优化以下参数
net.ipv4.tcp_max_tw_buckets
net.netfilter.nf_conntrack_max
net.ipv4.tcp_fin_timeout
net.netfilter.nf_conntrack_tcp_timeout_time_wait
net.ipv4.tcp_tw_reuse
net.ipv4.ip_local_port_range
fs.nr_open
fs.file-max
ulimit 设置的是nofile,用户进程可分配的最大文件数
file-max 所有进程最大的文件数
nr_open 单个进程可分配的最大文件数
为了缓解 SYN FLOOD,优化以下参数
net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_syncookies
net.ipv4.tcp_synack_retries
长连接场景中,优化以下参数
net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_probes
可以使用netstat -s 统计TCP/IP 网络包的情况,使用ss -s 查看当前的连接数状态
套接字
net.core.optmem_max
net.core.rmem_max
net.core.wmem_max
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem
net.ipv4.udp_mem
net.core.somaxconn
应用程序
从网络I/O角度
- 使用I/O多路复用,使用epoll代替select和poll。
- 使用异步IO
从工作进程角度
- 使用Master + 多Worker
- 多进程监听相同端口
IPTables
net.netfilter.nf_conntrack_max
DNS
- DNS 缓存
- 使用HTTPDNS代替DNS
- 使用masqdns本地缓存
五、应用
从CPU来说,简化代码,优化算法,异步处理,以及编译参数优化
从内存来说,使用大页,内存池技术,减少内存的动态分配,从而减少缺页异常
从IO来说,使用缓存,写时复制,增大I/O尺寸等
从网络,使用IO多路复用,长连接代替短连接,DNS缓存
从进程的工作模型,使用异步处理,多进程,多线程,充分利用CPU的使用。
最后可以使用负载均衡,消息中间件,CDN,把请求分散到多个节点,利用分布式优势。