平时多多少少在工作中会遇到性能问题相关的工作,记录一下大致的思路以及方法。
1. 指导思想
抓大放小,可以采用两种方向:
一种是自底向上,先从操作系统发现某一现象,例如内存过高,负载过高,io过大等等,然后再逐渐到应用层找到引起该问题的代码。
另一种是首先在应用层的代码测通过code review发现大致问题,通过debug或者AB测试的方式,逐步在操作系统层面,通过一系列工具如top、free等等核对效果。
2. 常用排查策略
2.1 top
第一行
第二行
第三行
第四行
buffer(缓冲)是为了提高内存和硬盘(或其他I/O设备)之间的数据交换的速度而设计的,cache(缓存)是从CPU角度考虑,是为了提高cpu和内存之间的数据交换速度而设计的。简单来说,buff是即将要被写入磁盘的,而cache是被从磁盘中读出来的
第六行
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是指正在运行和准备好运行的进程的总数。
在多核处理中,你的负载均值不应该高于处理器核心的总数量
常用命令
K:终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽
s:改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s
m:切换显示内存信息
t:切换显示进程和CPU状态信息
c:切换显示命令名称和完整命令行
M:根据驻留内存大小进行排序
P:根据CPU使用百分比大小进行排序
2.2 ps
ps -efjH 进程间关系以树形图方式展示
ps -aux或ps -ef展示进程详细信息
2.3 iostat
iostat -x 5命令,表示开始监控输入输出状态,-x表示显示所有参数信息,5表示每隔5秒监控一次
2.4 netstat
netstat -anp
Local Address:本地地址
1) 0.0.0.0:2000:表示监听服务器上所有ip地址的2000端口(0.0.0.0表示本地所有ip)
2) :::2000:也表示监听本地所有ip的2000端口。和 0.0.0.0:2000 的 区别是这里表示的是 IPv6地址,0.0.0.0表示的是本地所有 IPv4地址。
3) ":::" 这三个 : 的前两个 "::" ,是 "0:0:0:0:0:0:0:0" 的缩写,相当于IPv6的 "0.0.0.0" 。表示本机的所有IPv6地址,第三个 : 是IP和端口的分隔符
4) 127.0.0.1:8080:表示监听本机的loopback地址的8080端口。如果某个服务只监听了回环地址,那么只能在本机进行访问,无法通过tcp/ip 协议进行远程访问
5) ::1:9000:表示监听IPv6的回环地址的9000端口,::1这个表示IPv6的loopback地址
3. Foreign Address:外部地址
与本机端口通信的外部socket。显示规则与 Local Address 相同
State:状态
链路状态,共有11种。state列共有12中可能的状态,前面11种是按照TCP连接建立的三次握手和TCP连接断开的四次挥手过程来描述的。
状态参数主要有:
1) LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN。 来自远方TCP端口的连接请求
2) SYN_SENT:客户端通过应用程序调用connect进行active open。于是客户端tcp发送一个SYN以请求建立一个连接,状态置为SYN_SENT。 在发送连接请求后等待匹配的连接请求
3) SYN_RECV:服务端应发出ACK确认客户端的 SYN,同时自己向客户端发送一个SYN,状态置为SYN_RECV。 在收到和发送一个连接请求后等待对连接请求的确认
4) ESTABLISHED:代表一个打开的连接,双方可以进行或已经在数据交互了。 代表一个打开的连接,数据可以传送给用户
5) FIN-WAIT-1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态。 等待远程TCP连接中断请求,或先前的连接中断请求的确认
6) CLOSE-WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT。 等待从本地用户发来的连接中断请求
7) FIN-WAIT-2:主动关闭端接到ACK后,就进入了 FIN-WAIT-2。 从远程TCP等待连接中断请求
8) LAST-ACK:被动关闭端一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP也发送一个 FIN,等待对方的ACK,这就进入了LAST-ACK。 等待原来发向远程TCP的连接中断请求的确认
9) TIME-WAIT:在主动关闭端接收到FIN后,TCP 就发送ACK包,并进入TIME-WAIT状态。 等待足够的时间以确保远程TCP接收到连接中断请求的确认
10) CLOSING:比较少见。 等待远程TCP对连接中断的确认
11) CLOSED:被动关闭端在接受到ACK包后,就进入了closed的状态。 链接结束,没有任何连接状态
12) UNKNOWN:未知的Socket状态
2.3 SWAP
swap相关的讲解详见【转载】Linux SWAP 深度解读 - 知乎文章来源:https://www.toymoban.com/news/detail-453294.html
调整SWAP大小的方式如下:
文章来源地址https://www.toymoban.com/news/detail-453294.html
#查看内存使用情况
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
到了这里,关于性能优化的大致策略的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!