我是靠谱客的博主 欣慰月亮,最近开发中收集的这篇文章主要介绍【Linux】Linux性能优化,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.Linux性能工具图

在这里插入图片描述

2.性能优化方向

在这里插入图片描述

3.CPU

⑴平均负载

平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,可以简单理解为平均活跃进程数,它和 CPU 使用率并没有直接关系。

当我们使用top或uptime时候可以看到:

load averages: 3.91 4.40 4.94

过去 1 分钟、5 分钟、15 分钟的平均负载(Load Average),注意顺序哈!平均负载的三个值的是一种进程活跃趋势。

  • 可运行态 是指正在使用 CPU 或者正在等待 CPU 的进程,也就是我们常用 ps 命令看到的,处于 R 状态(Running 或 Runnable)的进程

  • 不可中断态 是正处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件设备的 I/O 响应,也就是我们在 ps 命令中看到的 D 状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程,是系统对进程和硬件设备的一种保护机制

当平均负载为 2 时,意味着什么呢?

  • 在只有 2 个 CPU 的系统上,意味着所有的 CPU 都刚好被完全占用。
  • 在 4 个 CPU 的系统上,意味着 CPU 有 50% 的空闲。
  • 而在只有 1 个 CPU 的系统中,则意味着有一半的进程竞争不到 CPU。

一般当平均负载高于 CPU 数量 70% 的时,我们就应该注意了。

平均负载和CPU使用率的关系:
平均负载它仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程。

而 CPU 使用率,是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应。

  • CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的
  • I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高
  • 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高

⑵CPU上下文切换

平均负载升高有个容易被忽视的原因就是多个进程竞争 CPU,CPU 上下文切换。

CPU上下文包括:

  • 寄存器 CPU自带的快速内存
  • 程序计数器 存储当前或者即将执行的下一条指令位置

CPU 上下文切换就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。

而这些保存下来的上下文,会存储在系统内核中,并在任务重新调度执行时再次加载进来。这样就能保证任务原来的状态不受影响,让任务看起来还是连续运行。

①进程上下文切换

Linux 按照特权等级,把进程的运行空间分为内核空间和用户空间

  • 内核空间具有最高权限,可以直接访问所有资源
  • 用户空间只能访问受限资源,不能直接访问内存等硬件设备,必须通过系统调用陷入到内核中,才能访问这些特权资源。

进程既可以在用户空间运行,又可以在内核空间中运行。进程在用户空间运行时,被称为进程的用户态,而陷入内核空间的时候,被称为进程的内核态。

②线程上下文切换
③中断上下文切换

工具篇:
stress 是一个 Linux 系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景

mpstat 是一个常用的多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标

# -P ALL 表示监控所有 CPU,后面数字 5 表示间隔 5 秒后输出一组数据
$ mpstat -P ALL 5
Linux 4.15.0 (ubuntu) 09/22/18 _x86_64_ (2 CPU)
13:30:06     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
13:30:11     all   50.05    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   49.95
13:30:11       0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
13:30:11       1  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00

pidstat 是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标。

$ pidstat -u 5 1
13:37:07      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
13:37:12        0      2962  100.00    0.00    0.00    0.00  100.00     1  stress

top和ps或者lsof

htop 因为它更直接(在F2配置中勾选所有开关项,打开颜色区分功能),不同的负载会用不同的颜色标识。比如cpu密集型的应用,它的负载颜色是绿色偏高,iowait的操作,它的负载颜色是红色偏高等等

atop命令,好像是基于sar的统计生成的报告,直接就把有问题的进程标红了,更直观

4.内存

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5.网络

⑴查看网络配置命令

ifconfig eth0
eth0      Link encap:Ethernet  HWaddr F6:DA:F4:1F:5E:CB  
          inet addr:10.144.46.155  Bcast:10.144.255.255  Mask:255.255.0.0
          inet6 addr: fe80::f4da:f4ff:fe1f:5ecb/64 Scope:Link
          UP BROADCAST RUNNING(表示物理网络连通) MULTICAST  MTU:1500  Metric:1
          RX(重点) packets:1744127025 errors:0 dropped:0 overruns:0 frame:0
          TX(重点) packets:1726557188 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:111947366067 (104.2 GiB)  TX bytes:234661860465 (218.5 GiB)
  • errors 表示发生错误的数据包数,比如校验错误、帧同步错误等;
  • dropped 表示丢弃的数据包数,即数据包已经收到了 Ring Buffer,但因为内存不足等原因丢包;
  • overruns 表示超限数据包数,即网络 I/O 速度过快,导致 Ring Buffer 中的数据包来不及处理(队列满)而导致的丢包;
  • carrier 表示发生 carrirer 错误的数据包数,比如双工模式不匹配、物理电缆出现问题等;
  • collisions 表示碰撞数据包数。

⑵查看套接字信息

[work(caibin)@tjtx144-46-155 ~]$ netstat -nlp | head -n 3
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q(重点) Send-Q(重点) Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      -        

接收队列(Recv-Q)和发送队列(Send-Q)需要你特别关注,它们通常应该是 0。当你发现它们不是 0 时,说明有网络包的堆积发生。

在不同套接字状态下,它们的含义不同:

  • 当套接字处于连接状态(Established)时
    • Recv-Q 表示套接字缓冲还没有被应用程序取走的字节数(即接收队列长度)
    • 而 Send-Q 表示还没有被远端主机确认的字节数(即发送队列长度)
  • 当套接字处于监听状态(Listening)时
    • Recv-Q 表示 syn backlog 的当前值
    • 而 Send-Q 表示最大的 syn backlog 值

⑶协议栈统计信息

ss 只显示已经连接、关闭、孤儿套接字等简要统计,而 netstat 则提供的是更详细的网络协议栈信息。

①简单模式
[work(caibin)@tjtx144-46-155 ~]$ ss -s  //非工具
Total: 837 (kernel 0)
TCP:   21455 (estab 793, closed 20650, orphaned 3, synrecv 0, timewait 1716/0), ports 0

Transport Total     IP        IPv6
*	  0         -         -        
RAW	  0         0         0        
UDP	  18        2         16       
TCP	  805       15        790      
INET	  823       17        806      
FRAG	  0         0         0     
②复杂模式
$ netstat -s

⑶网络吞吐和PPS

sar命令(无需安装)

# 数字 1 表示每隔 1 秒输出一组数据
$ sar -n DEV 1
[work(caibin)@tjtx144-46-155 ~]$ sar -n DEV 1
Linux 4.18.7-1.el7.elrepo.x86_64 (tjtx144-46-155.58os.org) 	12/29/2019 	_x86_64_	(40 CPU)

07:25:48 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
07:25:49 PM      eth0   7309.78   7288.04    430.63    947.79      0.00      0.00      0.00
07:25:49 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
07:25:49 PM     tunl0      0.00      0.00      0.00      0.00      0.00      0.00      0.00
07:25:49 PM    tunnat      0.00      0.00      0.00      0.00      0.00      0.00      0.00
  • rxpck/s 和 txpck/s 分别是接收和发送的 PPS,单位为包 / 秒。
  • rxkB/s 和 txkB/s 分别是接收和发送的吞吐量,单位是 KB/ 秒。
  • rxcmp/s 和 txcmp/s 分别是接收和发送的压缩数据包数,单位是包 / 秒。
  • %ifutil 是网络接口的使用率,即半双工模式下为 (rxkB/s+txkB/s)/Bandwidth,而全双工模式下为 max(rxkB/s, txkB/s)/Bandwidth。

查看网络带宽
ethtool(无需安装)

[work(caibin)@tjtx144-46-155 ~]$ ethtool eth0 | grep Speed
Cannot get wake-on-lan settings: Operation not permitted
	Speed: 10000Mb/s

压测工具

sysbench 是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试

最后

以上就是欣慰月亮为你收集整理的【Linux】Linux性能优化的全部内容,希望文章能够帮你解决【Linux】Linux性能优化所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部