1.Linux操作系统简要架构图
2.CPU性能分析
CPU对数据进行判断以及逻辑处理,本身不能存储数据;CPU从内存取数据进行逻辑计算,如果内存没有数据,才会从硬盘读数据到内存,再对数据进行处理。
2.1 上下文切换
每个CPU(或多核CPU的每个核心)在同一时间只能执行一个线程,Linux采用抢占式调度。当线程执行到达一个时间片后,如果线程有IO阻塞或高优先级线程要执行的时候,Linux将执行线程切换,切换前先保存当前线程执行状态(现场),并恢复待执行线程状态,这个过程就叫做上下文切换。在Java应用中,文件IO、网络IO、锁等待、线程Sleep操作都会使该线程进行阻塞或睡眠状态,从而触发上下文切换。频繁的上下文切换会造成内核占用较高的CPU,使得响应速度下降。
2.2 系统中断
CPU 在执行程序的过程中,出现了某些突发事件急待处理, CPU 必须暂停当前程序的执行,转去处理突发事件,处理完毕后又返回原程序被中断的位置继续执行。
2.3 系统CPU使用率
系统中断和切换频繁很耗用CPU,共享资源竞争,大量io交互;CPU太差,主频太低。
2.4 用户CPU使用率
计算量大,比如运算,连接查询,数据统计;非空闲等待,比如IO等待、资源争用(同一资源被不同线程请求,而此资源又需要保持一致性,只能前一个释放后一个再访问,这样导致的等待);过多的系统调用,系统调用即调用操作系统提供的程序接口,比如Java项目中写日志,会调用系统接口进行日志写操作,这样会导致系统CPU使用率过高;过多的中断,中断是CPU用来响应请求的机制,比如键盘的输入,鼠标的点击等都会产生中断,中断是通知CPU有任务需要响应,CPU停下正在执行的程序来响应当前的中断;
2.5 运行队列
每个CPU核心都维护了一个可运行队列,例如一个4核CPU,启动8个线程,且8个线程都处于可运行状态,平均分配情况下,每个核心的可运行队列里就有2个线程。通常而言,系统的load是由CPU运行队列决定的,假设以上状态维持了1分钟,则1分钟内系统load就是2。运行队列值越大,代表线程要消耗越长的时间才能执行完成。通常建议每个核心运行队列为1-3个。
2.6 命令使用
3.内存性能分析
3.1 物理内存和虚拟内存
物理内存就是系统硬件提供的内存大小,是真正的内存。相对于物理内存,在 Linux 下还有一个虚拟内存的概念,虚拟内存是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存。用作虚拟内存的磁盘空间被称为交换空间(又称SWAP空间)。
3.2 Buffer和Cache
Cache主要用作加速CPU和内存之间的数据交换,针对读操作多一点。 Buffer主要用作内存和磁盘之间的数据交换,针对写操作多一点。
3.3 内存页交换
Linux 的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。
页交换的运行机制,需要知道以下2个方面:
- 首先,Linux 系统会不时地进行页面交换操作,以保持尽可能多的空闲物理内存,即使并没有什么事情需要内存,Linux 也会交换出暂时不用的内存页面,因为这样可以大大节省等待交换所需的时间。
- 其次,Linux 进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存,Linux 内核根据“最近最经常使用”算法,仅仅将一些不经常使用的页面文件交换到虚拟内存。
有时我们会看到这么一个现象,Linux 物理内存还有很多,但是交换空间也使用了很多,其实这并不奇怪。例如,一个占用很大内存的进程运行时,需要耗费很多内存资源,此时就会有一些不常用页面文件被交换到虚拟内存中,但后来这个占用很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页面文件并不会自动交换进物理内存(除非有这个必要),那么此时系统物理内存就会空闲很多,同时交换空间也在被使用,就出现了刚才所说的现象了。最后,交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页面,它们又会被马上交换出去,如此一来,虚拟内存中可能没有足够的空间来存储这些交换页面,最终会导致 Linux 出现假死机、服务异常等问题。Linux 虽然可以在一段时间内自行恢复,但是恢复后的系统己经基本不可用了。
3.4 内存泄漏(memory leak)
是指程序在申请内存后,无法释放已申请的内存空间,导致系统无法及时回收内存并且分配给其他进程使用。通常少次数的内存无法及时回收并不会到程序造成什么影响,但是如果在内存本身就比较少获取多次导致内存无法正常回收时,就会导致内存不够用,最终导致内存溢出。
3.5 内存溢出 (out of memory)
指程序申请内存时,没有足够的内存供申请者使用,导致数据无法正常存储到内存中。
3.6 命令使用
4. 磁盘性能分析
4.1 五个指标
1:利用率(Utilization):磁盘处理 I/O 的时间百分比。过度使用(如超过 80%)通常意味着磁盘 I/O 存在性能瓶颈。
2:饱和度(Saturation):指磁盘处理 I/O 的繁忙程度。过度饱和意味着磁盘存在严重的性能瓶颈。当饱和度为 100% 时,磁盘无法接受新的 I/O 请求。
3:IOPS(Input/Output Per Second):指每秒 I/O 请求的数量。
4:吞吐量(Throughput):每秒 I/O 请求的大小。
5:响应时间(Response time):指发送 I/O 请求和接收响应之间的间隔时间。
关于利用率,我们只考虑有无 I/O,而不考虑 I/O 的大小。也就是说,当利用率为 100% 时,磁盘仍有可能接受新的 I/O 请求。
4.2 分析思路和步骤
- 通过top查看系统整体情况,如果wa过大,详细分析磁盘IO瓶颈;
- 使用 iostat 分析磁盘I/O使用率,磁盘I/O响应时间,磁盘I/O队列长度,查看这3个指标;
- 如果磁盘I/O使用率过高,或磁盘I/O响应时间过长,或磁盘I/O队列长度过大,再借助 pidstat ,定位出导致瓶颈的进程;
- 通过strace来定位进程的所有系统调用,随后分析进程的 I/O 行为;
- 最后通过lsof分析这些 I/O 的来源既进程操作的文件。
4.3 命令使用
5.网络性能分析
5.1 网络性能指标
- 带宽:表示链路的最大传输速率,单位通常为 b/s (比特/秒)
通常带宽受物理网卡的限制,网卡确定后,带宽随即确定(当然,实际带宽会受限于整个网络链路中最小的那个模块) - 吞吐量:表示单位时间内成功传输的数据量,单位通常为 b/s(比特/秒)或者 B/s(字节/秒)吞吐量受带宽限制。“网络带宽测试”,这里测试的实际上不是带宽,而是网络吞吐量。网络使用率 = 吞吐量 / 带宽Linux 服务器的网络吞吐量一般会比带宽小,而对交换机等专门的网络设备来说,吞吐量一般会接近带宽。
- 延时:表示从网络请求发出后,一直到收到远端响应,所需要的时间延迟在不同场景中,延时可能会有不同含义。比如它可以表示,建立连接需要的时间(比如 TCP 握手延时),或一个数据包往返所需的时间(比如 RTT)。
- PPS:是 Packet Per Second(包/秒)的缩写,表示以网络包为单位的传输速率PPS 通常用来评估网络的转发能力,比如硬件交换机通常可以达到线性转发(即 PPS 可以达到或者接近理论最大值)。而基于 Linux 服务器的转发,则容易受网络包大小的影响。对 TCP 或者 Web 服务来说,更多会用并发连接数和每秒请求数(QPS,Query per Second)等指标,它们更能反应实际应用程序的性能。
- 网络的可用性(网络能否正常通信)、并发连接数(TCP 连接数量)、丢包率(丢包百分比)、重传率(重新传输的网络包比例)等也是常用的性能指标。
5.2 网络问题排查
1.网络不通:
物理链路是否连通:ethtool ethX
网卡是否正常启用:ifconfig ethX
网关是否正确设置:route -n
DNS状态:nslookup ,及时生效的DNS配置—/etc/resolv.conf,永久生效的DNS配置—/etc/networks/interfaces
能否路由到目标主机:traceroute
本地端口、远程端口是否开放:netstat -ntlp |grep PORT,telnet IP PORT , nmap -p PORT IP
2.网络速度慢
DNS是否是问题的源头
查看路由过程中哪些节点是瓶颈
查看带宽的使用情况