一、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,把请求分散到多个节点,利用分布式优势。