性能调优
CPU
平均负载
-
查看
-
定义
- 单位时间内,系统中处于可运行状态和不可中断状态的平均进程数。即单位时间的活跃进程数
-
可运行状态的进程
- 正在使用cpu或者正在等待cpu的进程,即ps aux命令下STAT处于R状态的进程
-
不可中断状态的进程
- 处于内核态关键流程中的进程,且不可被打断,如等待硬件设备IO响应,ps命令D状态的进程
-
判断指标
-
理想状态
- 每个cpu上都有一个活跃进程,即平均负载数等于cpu数
-
过载经验值
- 一般来说,当平均负载高于cpu数量70%的时候,就应该引起重视了. 一旦负载过高,就可能导致响应变慢,进而影响服务的正常功能
CPU使用率
-
查看
- top, pidstat, grep ^cpu /proc/stat
-
定义
- 除了空闲时间外的其他时间占总 CPU 时间的百分比
-
字段
- us (user) - 用户态cpu时间. 注意它不包括下面的nice时间, 但包括了guest时间
- ni (nice) - 低优先级用户cpu时间.也就是进程的nice值被调到了1-19之间时的cpu时间
- sy (system) - 内核态cpu时间
- id (idle) - 空闲时间. 注意, 它不包括等待I/O时间
- wa (iowait) - 等待I/O的cpu时间
- hi (irq) - 处理硬中断的cpu时间
- si (softirq) - 处理软中断的cpu时间
- st (steal) - 当系统运行在虚拟机中的时候, 被其他虚拟机占用的cpu时间
- guest - 通过虚拟化运行其他操作系统的时间, 也就是运行虚拟机的时间
- gnice (guest nice) - 低优先级运行虚拟机的时间
优化
-
CPU绑定
- 把进程绑定在一个或多个CPU上,可提高CPU缓存命中率,减少跨CPU调度带来的上下文切换问题
-
调整优先级
- 适当降低非核心应用的优先级, 确保核心应用得到优先处理
-
为进程设置资源限制
- 设置进程的CPU使用上限, 可防止由于进程自身的问题耗尽系统资源
-
中断负载均衡
- 无论是软中断还是硬中断, 都会耗费大量的CPU资源,开启irqbalance服务或配置smp_affinity, 可把中断处理过程均衡到多个CPU上
内存
优化
-
最好禁止 Swap
- 如果必须开启 Swap,降低 swappiness 的值,减少内存回收时 Swap 的使用倾向
-
减少内存的动态分配
- 比如,可以使用内存池、大页(HugePage)等。(开发)
-
尽量使用缓存和缓冲区来访问数据
- 如可以使用堆栈明确声明内存空间来存储需要缓存的数据(开发);或者用 Redis 这类的外部缓存组件优化数据的访问
-
限制内存资源
- 使用 cgroups 等方式限制进程的内存使用情况,确保系统内存不会被异常进程耗尽
-
设置oom_score
- 通过 /proc/pid/oom_adj调整核心应用的 oom_score。这样,可以保证即使内存紧张,核心应用也不会被 OOM 杀死
磁盘
优化
-
应用程序优化
- 在应用程序内部构建自己的缓存,或者用 Redis 这类外部缓存系统
- 在需要同步写的场景中,尽量将写请求合并,而不是让每个请求都同步写入磁盘,即可以用 fsync() 取代 O_SYNC
-
文件系统优化
-
磁盘优化
- 换用性能更好的磁盘,比如用 SSD 替代 HDD
- 使用 RAID ,把多块磁盘组合成一个逻辑磁盘,构成冗余独立磁盘阵列
- 对应用程序的数据,进行磁盘级别的隔离
网络
指标
查看
-
协议栈统计信息
-
网络吞吐量和 PPS
-
连通性和延时
-
网络连接数
压测
-
ab测试
- Apache 自带的 HTTP 压测工具,主要测试 HTTP 服务的每秒请求数、请求延迟、吞吐量以及请求延迟的分布情况等
- ab -c 500 -n 5000 http://192.168.10.11/ #-c 并发请求数 -n 总请求数
-
wrk测试
- HTTP 性能测试工具,内置了 LuaJIT,方便你根据实际需求,生成所需的请求负载,或者自定义响应的处理方法
优化
-
应用程序
- 使用长连接取代短连接,可以显著降低 TCP 建立连接的成本。在每秒请求次数较多时,这样做的效果非常明显
- 使用内存等方式,来缓存不常变化的数据,可以降低网络 I/O 次数,同时加快应用程序的响应速度
-
套接字 -
传输层
-
TCP优化
- 增大处于 TIME_WAIT 状态的连接数量 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。这样,被 TIME_WAIT 状态占用的端口,还能用到新建的连接中
- 增大本地端口的范围 net.ipv4.ip_local_port_range 。这样就可以支持更多连接,提高整体的并发能力
- 增加最大文件描述符的数量
-
UDP优化 -
链路层
nginx调优
Nginx运行工作进程数量(worker_processes)
- 一般设置CPU的核心或者auto, 最多8个,8个以上性能提升不会再提升了,而且稳定性变得更低
- worker_processes 4;
Nginx运行CPU亲和力(worker_cpu_affinity)
- 2核CPU: worker_cpu_affinity 01 10;
- 4核CPU: worker_cpu_affinity 0001 0010 0100 1000;
Nginx最大打开文件数(worker_rlimit_nofile)
- worker_rlimit_nofile 65535;
连接超时时间
-
keepalive_timeout 60;
- 客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接
gzip 调优
- 使用gzip压缩功能,可能为我们节约带宽,加快传输速度,有更好的体验,也为我们节约成本
- Nginx启用压缩功能需要你来ngx_http_gzip_module模块,apache使用的是mod_deflate
expires 缓存调优
- 针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大
防盗链
内核参数优化(TCP)
-
net.ipv4.tcp_max_tw_buckets = 6000
- 操作系统允许TIME_WAIT套接字数量的最大值,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。该参数默认为180000,过多的TIME_WAIT套接字会使Web服务器变慢。注:主动关闭连接的服务端会产生TIME_WAIT状态的连接
-
net.ipv4.ip_local_port_range = 1024 65000
-
net.ipv4.tcp_tw_recycle = 1
-
net.ipv4.tcp_tw_reuse = 1
- 开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。这对于服务器来说很有意义,因为服务器上总会有大量TIME-WAIT状态的连接
-
net.ipv4.tcp_syncookies = 1
- 开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理
MySQL调优
代码优化
定位慢SQL,并优化
合理使用索引
分表
集群
缓存
|