平时多多少少在工作中会遇到性能问题相关的工作,记录一下大致的思路以及方法。
1. 指导思想
抓大放小,可以采用两种方向:
一种是自底向上,先从操作系统发现某一现象,例如内存过高,负载过高,io过大等等,然后再逐渐到应用层找到引起该问题的代码。
另一种是首先在应用层的代码测通过code review发现大致问题,通过debug或者AB测试的方式,逐步在操作系统层面,通过一系列工具如top、free等等核对效果。
2. 常用排查策略
2.1 top
第一行
第二行
第三行
第四行
第六行
VIRT、RES、SHR详解
36. VIRT -- Virtual Memory Size (KiB)
The total amount of virtual memory used by the task. It includes all code, data and shared libraries plus pages that have been swapped out and pages that have been mapped but not used.
17. RES -- Resident Memory Size (KiB) 常驻内存
The non-swapped physical memory a task is using.
21. SHR -- Shared Memory Size (KiB)
The amount of shared memory available to a task, not all of which is typically resident. It simply reflects memory that could be potentially shared with other processes.
S:这个是进程的状态。它有以下不同的值:
D - 不可中断的睡眠态。
R – 运行态
S – 睡眠态
T – 被跟踪或已停止
Z – 僵尸态
%CPU:自从上一次更新时到现在任务所使用的CPU时间百分比。
%MEM:进程使用的可用物理内存百分比。
TIME+:任务启动后到现在所使用的全部CPU时间,精确到百分之一秒。
负载的定义
在Linux中,进程分为三种状态,一种是阻塞的进程blocked process(等待I/O设备的数据或者系统调),一种是可运行的进程runnable process,另外就是正在运行的进程running process。进程可运行状态时,它处在一个运行队列run queue中,与其他可运行进程争夺CPU时间。 系统的load是指正在运行和准备好运行的进程的总数。
在多核处理中,你的负载均值不应该高于处理器核心的总数量
2.2 SWAP
swap相关的讲解详见【转载】Linux SWAP 深度解读 - 知乎
调整SWAP大小的方式如下:
#查看内存使用情况
free -h
# 关闭分区
swapoff -a
# 开启分区
swapon -a
# 创建一个2*1G的空间,用于swap
dd if=/dev/zero of=/etc/swapfile bs=1G count=2
#转换为swap分区
mkswap /etc/swapfile
#激活新生成的swap分区
swapon /etc/swapfile
#如果需要重启后也继续存在,修改/etc/fstab,增加如下内容
/home/swapfile swap swap defaults 0 0