LINUX系统优化
2021-06-25 08:33:44 1 举报
AI智能生成
linux系统优化
作者其他创作
大纲/内容
文件系统
文件系统原理
虚拟文件系统
文件系统I/O栈
文件系统缓存
文件系统种类
性能指标
容量
IPOS
缓存命中率
性能剖析
df
strace
vmstat
sar
perf
proc文件系统
调优方法
文件系统选型
利用文件系统缓存
I/O隔离
Linux内核
内核原理
内核态
性能剖析
BPF
perf
proc文件系统
内核调优
内核选项
应用程序
性能指标
吞吐量
响应时间
资源利用率
性能剖析
USE方法
使用率
饱和度
错误
进程剖析
进程状态
资源使用率
I/O剖析
系统调用
热点函数
动态追踪
APM
调优方法
逻辑简化
编程语言
算法调优
非阻塞I/O
利用缓存与缓冲区
异步处理与并发
垃圾回收
架构设计
空间换时间
缓存
缓冲区
冗余数据
时间换空间
压缩编码
页面交换
并行处理
多线程
多进程
分布式
异步处理
异步I/O
消息队列
时间通知
性能监控
时间序列分析
历史趋势分析
性能模型构建
未来趋势预测
服务调用追踪
服务调用流程追踪
服务调用性能分析
服务调用拓扑展示
数据可视化
趋势图
散点图
热图
饼图
告警通知
阈值选择
报警策略
通知渠道
性能测试
明确需求
系统资源需求
应用资源需求
环境假设
合理的假设
生产环境模拟
生产负载模拟
性能测试
基准测试
负载测试
压力测试
ab
ab -c 10 -n 10000 http://10.240.0.5:10000/
并发 10 个请求测试 Nginx 性能,总共测试 10000 个请求
结果分析
应用程序瓶颈
数据库瓶颈
系统资源瓶颈
CPU
进程和CPU原理
进程与线程
cpu调度
中断系统
CPU缓存
NUMA
性能指标
平均负载
定义
平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,
也就是平均活跃进程数,它和 CPU 使用率并没有直接关系
也就是平均活跃进程数,它和 CPU 使用率并没有直接关系
可运行状态进程
可运行状态的进程,是指正在使用 CPU 或者正在等待 CPU 的进程,也就是我们常用 ps 命令看到的,处于 R 状态(Running 或 Runnable)的进程。
不可中断状态进程
不可中断状态的进程则是正处于内核态关键流程中的进程,并且这些流程是不可打断的,比
如最常见的是等待硬件设备的 I/O 响应,也就是我们在 ps 命令中看到的 D 状态
(Uninterruptible Sleep,也称为 Disk Sleep)的进程
如最常见的是等待硬件设备的 I/O 响应,也就是我们在 ps 命令中看到的 D 状态
(Uninterruptible Sleep,也称为 Disk Sleep)的进程
CPU使用率
用户CPU
系统CPU
IOWAIT
软中断
而下半部则是由内核触发,也就是我们常说的软中断,特点是延迟执行。
以内核线程的方式执行,并且每个 CPU 都对应一个软中断内核线程,名字为 “ksoftirqd/CPU
编号”,比如说, 0 号 CPU 对应的软中断内核线程的名字就是 ksoftirqd/0。
以内核线程的方式执行,并且每个 CPU 都对应一个软中断内核线程,名字为 “ksoftirqd/CPU
编号”,比如说, 0 号 CPU 对应的软中断内核线程的名字就是 ksoftirqd/0。
Linux 中的软中断包括网络收发、定时、调度、RCU 锁等各种类型,我们可以查看 proc 文
件系统中的 /proc/softirqs ,观察软中断的运行情况
件系统中的 /proc/softirqs ,观察软中断的运行情况
/proc/interrupts 提供了硬中断的运行情况。
硬中断
上半部直接处理硬件请求,也就是我们常说的硬中断,特点是快速执行;
/proc/softirqs 提供了软中断的运行情况;
窃取CPU
表示被其他虚拟机占用的 CPU 时间百分比,一般是在虚拟化中使用
客户CPU
运行客户虚拟机的CPU 时间百分比。
节拍率HZ
为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中
断,并使用全局变量 Jiffies 记录了开机以来的节拍数。每发生一次时间中断,Jiffies 的值
就加 1。
断,并使用全局变量 Jiffies 记录了开机以来的节拍数。每发生一次时间中断,Jiffies 的值
就加 1。
grep 'CONFIG_HZ=' /boot/config-$(uname -r)
节拍率 HZ 是内核的可配选项,可以设置为 100、250、1000 等。不同的系统可能设置不
同数值,你可以通过查询 /boot/config 内核选项来查看它的配置值。比如在我的系统中,
节拍率设置成了 250,也就是每秒钟触发 250 次时间中断
同数值,你可以通过查询 /boot/config 内核选项来查看它的配置值。比如在我的系统中,
节拍率设置成了 250,也就是每秒钟触发 250 次时间中断
上下文切换
自愿上下文切换
指进程无法获取所需资源,导致的上下文切换。比如说, I/O、
内存等系统资源不足时,就会发生自愿上下文切换。
内存等系统资源不足时,就会发生自愿上下文切换。
自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题;
非自愿上下文切换
指进程由于时间片已到等原因,被系统强制调度,进而发生的
上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。
上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。
非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU
的确成了瓶颈;
的确成了瓶颈;
进程上下文切换
进程是由内核来管理和调度的,进程的切换只能发生在内核态。进程的上下文不仅包括了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、
寄存器等内核空间的状态。:在保存当前进程的内核状态和 CPU 寄存器之前,需要先把该进程的虚拟内存、栈等保存下来;而加载了下一进程的内核态后,还需要刷新进程的虚拟内存和用户栈。
寄存器等内核空间的状态。:在保存当前进程的内核状态和 CPU 寄存器之前,需要先把该进程的虚拟内存、栈等保存下来;而加载了下一进程的内核态后,还需要刷新进程的虚拟内存和用户栈。
线程上下文切换
当进程只有一个线程时,可以认为进程就等于线程。当进程拥有多个线程时,这些线程会共享相同的虚拟内存和全局变量等资源。这些资源在上下文切换时是不需要修改的。另外,线程也有自己的私有数据,比如栈和寄存器等,这些在上下文切换时也是需要保存
的
的
中断上下文切换
为了快速响应硬件的事件,中断处理会打断进程的正常调度和执行,转而调用中断处理程
序,响应设备事件。而在打断其他进程时,就需要将进程当前的状态保存下来,这样在中断
结束后,进程仍然可以从原来的状态恢复运行。
序,响应设备事件。而在打断其他进程时,就需要将进程当前的状态保存下来,这样在中断
结束后,进程仍然可以从原来的状态恢复运行。
中断次数变多了,说明 CPU 被中断处理程序占用,还需要通过查看 /proc/interrupts 文
件来分析具体的中断类型。
件来分析具体的中断类型。
CPU缓存命中率
CPU 缓存的速度介于 CPU 和内存之间,缓存的是热点的内存数
据。根据不断增长的热点数据,这些缓存按照大小不同分为 L1、L2、L3 等三级缓存,其中
L1 和 L2 常用在单核中, L3 则用在多核中。从 L1 到 L3,三级缓存的大小依次增大,相应的,性能依次降低(当然比内存还是好得
多)。而它们的命中率,衡量的是 CPU 缓存的复用情况,命中率越高,则表示性能越好
据。根据不断增长的热点数据,这些缓存按照大小不同分为 L1、L2、L3 等三级缓存,其中
L1 和 L2 常用在单核中, L3 则用在多核中。从 L1 到 L3,三级缓存的大小依次增大,相应的,性能依次降低(当然比内存还是好得
多)。而它们的命中率,衡量的是 CPU 缓存的复用情况,命中率越高,则表示性能越好
性能剖析
top/ps
top 显示了系统总体的 CPU 和内存使用情况,以及各个进程的资源使用情况。
ps 则只显示了每个进程的资源使用情况。
ps 则只显示了每个进程的资源使用情况。
status 列含义
R 是 Running 或 Runnable 的缩写,表示进程在 CPU 的就绪队列中,正在运行或者正
在等待运行。
D 是 Disk Sleep 的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表
示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断。
Z 是 Zombie 的缩写,如果你玩过“植物大战僵尸”这款游戏,应该知道它的意思。它
表示僵尸进程,也就是进程实际上已经结束了,但是父进程还没有回收它的资源(比如进
程的描述符、PID 等)。
S 是 Interruptible Sleep 的缩写,也就是可中断状态睡眠,表示进程因为等待某个事件
而被系统挂起。当进程等待的事件发生时,它会被唤醒并进入 R 状态。
I 是 Idle 的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上。前面说了,硬件交
互导致的不可中断进程用 D 表示,但对某些内核线程来说,它们有可能实际上并没有任
何负载,用 Idle 正是为了区分这种情况。要注意,D 状态的进程会导致平均负载升高,
I 状态的进程却不会。
第一个是 T 或者 t,也就是 Stopped 或 Traced 的缩写,表示进程处于暂停或者跟踪状
态
另一个是 X,也就是 Dead 的缩写,表示进程已经消亡,所以你不会在 top 或者 ps 命令
中看到它
R 是 Running 或 Runnable 的缩写,表示进程在 CPU 的就绪队列中,正在运行或者正
在等待运行。
D 是 Disk Sleep 的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表
示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断。
Z 是 Zombie 的缩写,如果你玩过“植物大战僵尸”这款游戏,应该知道它的意思。它
表示僵尸进程,也就是进程实际上已经结束了,但是父进程还没有回收它的资源(比如进
程的描述符、PID 等)。
S 是 Interruptible Sleep 的缩写,也就是可中断状态睡眠,表示进程因为等待某个事件
而被系统挂起。当进程等待的事件发生时,它会被唤醒并进入 R 状态。
I 是 Idle 的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上。前面说了,硬件交
互导致的不可中断进程用 D 表示,但对某些内核线程来说,它们有可能实际上并没有任
何负载,用 Idle 正是为了区分这种情况。要注意,D 状态的进程会导致平均负载升高,
I 状态的进程却不会。
第一个是 T 或者 t,也就是 Stopped 或 Traced 的缩写,表示进程处于暂停或者跟踪状
态
另一个是 X,也就是 Dead 的缩写,表示进程已经消亡,所以你不会在 top 或者 ps 命令
中看到它
vmstat
是一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分
析 CPU 上下文切换和中断的次数
vmstat 5
cs(context switch)是每秒上下文切换的次数。
in(interrupt)则是每秒中断的次数。
r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程 数。
b(Blocked)则是处于不可中断睡眠状态的进程数
in(interrupt)则是每秒中断的次数。
r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程 数。
b(Blocked)则是处于不可中断睡眠状态的进程数
mpstat
一个常用的多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以
及所有 CPU 的平均指标。
及所有 CPU 的平均指标。
mpstat -P ALL 5
-P ALL 表示监控所有 CPU,后面数字 5 表示间隔 5 秒后输出一组数据
sar
sar 是一个系统活动报告工具,既可以实时查看系统的当前活动,又可以配置保存和报告历史统计数据。
# -n DEV 表示显示网络收发的报告,间隔 1 秒输出一组数据
$ sar -n DEV 1
$ sar -n DEV 1
pidstat
一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上
下文切换等性能指标。
下文切换等性能指标。
pidstat -u 5 1
间隔 5 秒后输出一组数据
pidstat -w -u 1 -t
-w 参数表示输出进程切换指标,而 -u 参数则表示输出 CPU 使用指标 -t显示线程
pidstat -d 1 10
-d 显示磁盘读写信息
strace
perf
perf top -g -p [pid]
输出结果中,第一行包含三个数据,分别是采样数(Samples)、事件类型(event)和事
件总数量(Event count)。比如这个例子中,perf 总共采集了 833 个 CPU 时钟事件,而
总事件数则为 97742399。
第一列 Overhead ,是该符号的性能事件在所有采样中的比例,用百分比来表示。
第二列 Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),
如内核、进程名、动态链接库名、内核模块名等。
第三列 Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动
态链接库,而 [k] 则表示内核空间。
最后一列 Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表
示。
件总数量(Event count)。比如这个例子中,perf 总共采集了 833 个 CPU 时钟事件,而
总事件数则为 97742399。
第一列 Overhead ,是该符号的性能事件在所有采样中的比例,用百分比来表示。
第二列 Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),
如内核、进程名、动态链接库名、内核模块名等。
第三列 Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动
态链接库,而 [k] 则表示内核空间。
最后一列 Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表
示。
perf record -g seleep 15 && perf report
# 记录性能事件,等待大约 15 秒后按 Ctrl+C 退出
$ perf record -g
# 查看报告
$ perf report
$ perf record -g
# 查看报告
$ perf report
execsnoop
一个专为短时进程设计的工具。它通过 ftrace 实时监控进程的 exec() 行
为,并输出短时进程的基本信息,包括进程 PID、父进程 PID、命令行参数以及执行的结
果。
为,并输出短时进程的基本信息,包括进程 PID、父进程 PID、命令行参数以及执行的结
果。
proc文件系统
grep 'model name' /proc/cpuinfo | wc -l
查看cpu个数
watch -d cat /proc/interrupts
提供了一个cpu只读的中断使用情况
cat /proc/stat | grep ^cpu
user(通常缩写为 us),代表用户态 CPU 时间。注意,它不包括下面的 nice 时间,但
包括了 guest 时间。
nice(通常缩写为 ni),代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整
为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优
先级反而越低。
system(通常缩写为 sys),代表内核态 CPU 时间。
idle(通常缩写为 id),代表空闲时间。注意,它不包括等待 I/O 的时间(iowait)。
iowait(通常缩写为 wa),代表等待 I/O 的 CPU 时间。
irq(通常缩写为 hi),代表处理硬中断的 CPU 时间。
softirq(通常缩写为 si),代表处理软中断的 CPU 时间。
steal(通常缩写为 st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU
时间。
guest(通常缩写为 guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚
拟机的 CPU 时间。
guest_nice(通常缩写为 gnice),代表以低优先级运行虚拟机的时间。
包括了 guest 时间。
nice(通常缩写为 ni),代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整
为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优
先级反而越低。
system(通常缩写为 sys),代表内核态 CPU 时间。
idle(通常缩写为 id),代表空闲时间。注意,它不包括等待 I/O 的时间(iowait)。
iowait(通常缩写为 wa),代表等待 I/O 的 CPU 时间。
irq(通常缩写为 hi),代表处理硬中断的 CPU 时间。
softirq(通常缩写为 si),代表处理软中断的 CPU 时间。
steal(通常缩写为 st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU
时间。
guest(通常缩写为 guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚
拟机的 CPU 时间。
guest_nice(通常缩写为 gnice),代表以低优先级运行虚拟机的时间。
/proc/stat
提供的就是系统的 CPU 和任务统计信息,代为是user_hz 10ms
提供的就是系统的 CPU 和任务统计信息,代为是user_hz 10ms
/proc/[pid]/stat
stress
一个 Linux 系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场
景
景
stress --cpu 1 --timeout 600
模拟 CPU压力
stress-ng -i 1 --hdd 1 --timeout 600
模拟 I/O 压力,即不停地执行 sync:
1: 对于pidstat,vmstat,top无法定位到问题的时候。
2: 可以选择perf record -g 记录。
3: 用perf report查看是否可以定位到问题。
4: 用pstree | grep [xx],这样定位到具体的调用方法里。
5: 用grep [xx] -r [项目文件],找到具体代码位置
2: 可以选择perf record -g 记录。
3: 用perf report查看是否可以定位到问题。
4: 用pstree | grep [xx],这样定位到具体的调用方法里。
5: 用grep [xx] -r [项目文件],找到具体代码位置
hping3
hping3 是一个可以构造 TCP/IP 协议数据包的工具,可以对系统进行安全审计、防火墙测试等。
# -S 参数表示设置 TCP 协议的 SYN(同步序列号),-p 表示目的端口为 80
# -i u100 表示每隔 100 微秒发送一个网络帧
# 注:如果你在实践过程中现象不明显,可以尝试把 100 调小,比如调成 10 甚至 1
$ hping3 -S -p 80 -i u100 192.168.0.30
# -i u100 表示每隔 100 微秒发送一个网络帧
# 注:如果你在实践过程中现象不明显,可以尝试把 100 调小,比如调成 10 甚至 1
$ hping3 -S -p 80 -i u100 192.168.0.30
tpcdump
tcpdump 是一个常用的网络抓包工具,常用来分析各种网络问题
# -i eth0 只抓取 eth0 网卡,-n 不解析协议名和主机名
# tcp port 80 表示只抓取 tcp 协议并且端口号为 80 的网络帧
$ tcpdump -i eth0 -n tcp port 80
# tcp port 80 表示只抓取 tcp 协议并且端口号为 80 的网络帧
$ tcpdump -i eth0 -n tcp port 80
调优方法
CPU绑定
# cpu-list可以是0,1这样的一个核,也可以是1-2这样的,表示绑定在1和2上面
# pid 表示进程号
taskset -cp cpu-list pid
# pid 表示进程号
taskset -cp cpu-list pid
进程CPU资源限制
进程优先级调整
renince -20 146
中断负载均衡
CPU缓存
NUMA优化
CPU独占
一,隔离CPU,避免其它线程run在被隔离的CPU上.
二,绑定所有的interrupts到非隔离的CPU上,避免被隔离的CPU收到interrupt.
三,据你希望地,把特定的线程绑定到某一被隔离的CPU上.
二,绑定所有的interrupts到非隔离的CPU上,避免被隔离的CPU收到interrupt.
三,据你希望地,把特定的线程绑定到某一被隔离的CPU上.
内存
内存原理
地址空间
虚拟内存
Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。这
样,进程就可以很方便地访问内存,更确切地说是访问虚拟内存。
虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同字长(也就是单个 CPU 指
令可以处理数据的最大长度)的处理器,地址空间的范围也不同
进程在用户态时,只能访问用户空间内存;只有进入内核
态后,才可以访问内核空间内存。虽然每个进程的地址空间都包含了内核空间,但这些内核
空间,其实关联的都是相同的物理内存。这样,进程切换到内核态后,就可以很方便地访问
内核空间内存。
样,进程就可以很方便地访问内存,更确切地说是访问虚拟内存。
虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同字长(也就是单个 CPU 指
令可以处理数据的最大长度)的处理器,地址空间的范围也不同
进程在用户态时,只能访问用户空间内存;只有进入内核
态后,才可以访问内核空间内存。虽然每个进程的地址空间都包含了内核空间,但这些内核
空间,其实关联的都是相同的物理内存。这样,进程切换到内核态后,就可以很方便地访问
内核空间内存。
内存分配与回收
缓存与缓冲区
SWAP
性能指标
系统内存使用量
进程内存使用量
缓存与缓冲区命中率
SWAP使用量
性能剖析
free
top
sar
vmstat
cachestat
cachetop
memleak
proc文件系统
调优方法
利用缓存与缓冲区
减少SWAP使用
减少动态内存分配
优化NUMA
限制进程内存资源
使用HugePage
网络
网络原理
网络配置
TCP/IP协议
网络收发流程
高级路由
网络Qos
网络防火墙
C10K与C100K
性能指标
吞吐量
BPS
QPS
PPS
延迟
丢包
TCP重传
性能剖析
ethtool
sar
ping
netstat/ss
ifstat
ifconfig
tcpdump
wireshark
iptables
traceroute
ipcontrack
perf
调优方法
网卡调优
MTU
队列长度
链路聚合
协议调优
HTTP
TCP
Overlay
资源控制
Qos
内核调优
NET调优
功能卸载
负载均衡
DPDK
磁盘I/O
磁盘原理
磁盘管理
磁盘类型
磁盘接口
磁盘I/O栈
性能指标
使用率
IOPS
吞吐量
IOWAIT
性能剖析
dstat
sar
iostat
pidstat
iotop
iolatency
blktrace
fio
perf
调优方法
系统调用
I/O资源控制
充分利用缓存
RAID
I/O隔离
0 条评论
下一页