Linux 性能优化
2024-11-20 19:30:33 0 举报
Linux性能优化是提升系统运行效率和稳定性的关键。它包括优化CPU调度、内存管理、I/O性能以及网络等方面。通过分析系统性能指标,我们可以找到性能瓶颈,并采取相应的优化策略。这包括调整系统参数,优化应用程序,以及升级硬件配置等。合理的性能优化可以提高系统的响应速度和吞吐量,为企业节省成本,提高用户体验。同时,这也是Linux系统管理员和运维工程师必备的技能之一。
作者其他创作
大纲/内容
01 如何学习 Linux 性能优化
性能指标是什么
选择指标评估应用程序和系统性能
为应用程序和系统性能设置性能目标
进行性能基准测试
性能分析定位瓶颈
优化系统和应用程序
性能监控和告警
学这个专栏需要什么基础
开发语言
学习重点
了解原理
如何学习
重原理不抓细节
边学边实践
多思考总结。
02 基础篇:如何理解“平均负载”
uptime
平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数, 也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。
不可中断状态的进程则是正处于内核态关键流程中的进程,并且这些流程是不可打断的,
比如最常见的是等待硬件设备的 I/O 响应,也就是我们在 ps 命令中看到的 D 状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程。
比如最常见的是等待硬件设备的 I/O 响应,也就是我们在 ps 命令中看到的 D 状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程。
查看 CPU 个数:grep 'model name' /proc/cpuinfo | wc -l
当平均负载高于 CPU 数量 70% 的时候,你就应该分析排查负载高的问题了。
与 CPU 利用率关系
CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的
I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高;
大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高
压力测试
使用 stress 和 sysstat(mpstat, pidstat)进行压力测试和指标监测
# -P ALL 表示监控所有 CPU,后面数字 5 表示间隔 5 秒后输出一组数据
mpstat -P ALL 5
mpstat -P ALL 5
# 间隔 5 秒后输出一组数据
pidstat -u 5 1
pidstat -u 5 1
watch -d uptime
总结
IO 密集型进程会导致高 iowait,因为有大量的不可中断 IO 行为。
当多个进程抢占 CPU 时也会导致 wait 飙升,因为抢占会导致等待
03 基础篇:经常说的 CPU 上下文切换
系统调用
CPU 上下文切换,就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来。
系统调用的过程会发生CPU 上下文切换,一次系统调用过程,发生了 2 次 CPU 上下文切换。
系统调用不会涉及虚拟内存等进程用户态的资源,也不会切换进程。
系统调用过程通常称为特权模式切换,而不是上下文切换。
系统调用不会涉及虚拟内存等进程用户态的资源,也不会切换进程。
系统调用过程通常称为特权模式切换,而不是上下文切换。
进程上下文切换
进程上下文不仅包括了虚拟内存,栈、全局变量等用户空间的资源,还包括内核堆栈、寄存器等内核空间状态。
进程上下文切换需要几十纳秒到数微秒的 CPU 时间。
Linux 通过 TLB(Translation Lookaside Buffer)管理虚拟内存到物理内存映射关系,同样需要刷新。
Linux 通过 TLB(Translation Lookaside Buffer)管理虚拟内存到物理内存映射关系,同样需要刷新。
发生调度因素
时间片耗尽
进程在系统资源不足
sleep
优先级更高进程需要运行时
线程上下文切换
线程自己的私有数据,比如栈和寄存器,这些切换需要保存
线程是调度基本单位,而进程则是资源拥有基本单位。调度对象实际为线程。
中断上下文切换
为了快速响应硬件的事件,中断处理会打断进程的正常调度和执行,转而调用中断处理程序,响应设备事件。
而在打断其他进程时,就需要将进程当前的状态保存下来,这样在中断结束后,进程仍然可以从原来的状态恢复运行。
不涉及进程的用户态,即便打断了一个正处在用户态进程,也不需要保存和恢复这个进程虚拟内存、全局变量等用户态资源。
中断上下文,只包括内核态中断服务程序执行所必须得状态,包括 CPU 寄存器、内核堆栈、硬件中断参数。
中断上下文,只包括内核态中断服务程序执行所必须得状态,包括 CPU 寄存器、内核堆栈、硬件中断参数。
04 基础篇:经常说的 CPU 上下文切换
如何查看系统上下文切换情况
vmstat 5
b(Blocked) 处于不可中断状态的进程数
b(Blocked) 处于不可中断状态的进程数
# 每隔 5 秒输出 1 组数据,查看每个进程上下文切换情况
pidstat -w 5
pidstat -w 5
自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。
比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。
比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。
比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。
案例
安装 sysbench sysstat
pidstat -wt 1 用来查看包括线程之间的上下文切换
很多时候使用 vmstat 看起来上下文切换频率高,但是在 pidstat 看起来不是很高,可能是进程内部线程内部进行了切换
很多时候使用 vmstat 看起来上下文切换频率高,但是在 pidstat 看起来不是很高,可能是进程内部线程内部进行了切换
/proc 实际上是 Linux 的一个虚拟文件系统,用于内核空间与用户空间之间的通信。/proc/interrupts 就是这种通信机制的一部分,提供了一个只读的中断使用情况。
中断次数变化速度最快的是重调度中断(RES),这个中断类型表示,唤醒空闲状态的 CPU 来调度新的任务运行。这是多处理器系统(SMP)中,调度器用来分散任务到不同 CPU 的机制,通常也被称为处理器间中断(Inter-Processor Interrupts,IPI)
系统的上下文切换次数稳定,数百到一万以内都算正常。
05 基础篇:某个应用的 CPU 使用率居然达到 100%
CPU 使用率
Linux 通过事先定义的节拍率(内核中表示为 HZ)触发时间中断,调度不同进程。
内核时钟:grep 'CONFIG_HZ=' /boot/config-$(uname -r)
为了方便用户空间程序,内核还提供了一个用户空间节拍率 USER_HZ,它总是固定为 100,也就是 1/100 秒
为了方便用户空间程序,内核还提供了一个用户空间节拍率 USER_HZ,它总是固定为 100,也就是 1/100 秒
cat /proc/stat | grep ^cpu
实际的 CPU 利用率都是通过这个文件或者/proc/[pid]/stat计算出来的。
实际的 CPU 利用率都是通过这个文件或者/proc/[pid]/stat计算出来的。
对比一下 top 和 ps 这两个工具报告的 CPU 使用率,默认的结果很可能不一样,
因为 top 默认使用 3 秒时间间隔,而 ps 使用的却是进程的整个生命周期。
因为 top 默认使用 3 秒时间间隔,而 ps 使用的却是进程的整个生命周期。
CPU 使用率过高怎么办
perf top,类似于 top,它能够实时显示占用 CPU 时钟最多的函数或者指令,因此可以用来查找热点函数
也就是 perf record 和 perf report。perf record 则提供了保存数据的功能,保存后的数据,需要你用 perf report 解析展示。
案例
perf top -g -p xxxx
ab -c 10 -n 100 http://192.168.0.10:10000/ #启动压测,并发 10 个请求测试 Nginx 性能,总过测试 100 个请求
docker cp phpfpm:/app .
grep sqrt -r app/
grep sqrt -r app/
06案例篇:CPU 使用率高,找不到高 CPU 应用
查找进程的父进程:pstree | grep stress
execsnoop 监控短时进程
07 案例篇:系统中出现大量
不可中断进程和僵尸进程(上)
不可中断进程和僵尸进程(上)
CPU使用率
用户 CPU 使用
系统 CPU(上下文切换)
等待I/O的 CPU(等待磁盘响应,iowait 升高)
中断 CPU(软中断和硬中断)
进程状态
D 是 Disk Sleep,不可中断状态睡眠,在跟硬件交互,不允许其他进程或中断打断。
Z 是 Zombie,进程结束了父进程还没有收回它的资源(进程描述符,PID 等)
S 是 Interruptible Sleep,可中断状态睡眠,进程因为等待某个事件被系统挂起。
I 是 Idle,空闲状态。用在不可中断睡眠的内核线程上,硬件交互导致的不可中断进程用 D 表示,但对某些内核线程来说,它们有可能实际上并没有任何负载,用 Idle 正是为了区分这种情况。
T或者 t,也就是Stopped或 Traced 缩写,表示进程处于暂停或者跟踪状态。
向一个进程发送 SIGSTOP 信号,他就会因响应这个信号变成暂停状态;再向它发送 SIGCONT,进程恢复运行。
gdb 调试一个进程时,使用断点中断时
向一个进程发送 SIGSTOP 信号,他就会因响应这个信号变成暂停状态;再向它发送 SIGCONT,进程恢复运行。
gdb 调试一个进程时,使用断点中断时
X Deat 缩写,top 中看不到。
操作
进程组
一组相互关联的进程,比如每个进程都是父进程所在组成员
会话
会话是指共享同一个控制终端的一个或多个进程组
08 案例篇:系统中出现大量
不可中断进程和僵尸进程
不可中断进程和僵尸进程
dstat 1 10 检测系统 IO
# -a 表示输出命令行选项
# p 表 PID
# s 表示指定进程的父进程
$ pstree -aps 3084
# p 表 PID
# s 表示指定进程的父进程
$ pstree -aps 3084
strace 是最常用的跟踪进程系统调用的工具
直接读写磁盘(O_DIRECT)可能直接导致非常高的 io,系统反应迟钝
09 基础篇:怎么理解 Linux 软中断
软中断
上半部用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或时间敏感的工作。
下半部用来延迟处理上半部未完成的工作,通常以内核线程的方式运行。
下半部用来延迟处理上半部未完成的工作,通常以内核线程的方式运行。
网卡收到数据,通过硬件中断快速处理,把网卡的数据读到内存,更新硬件寄存器状态,发送软中断。
软中断信号环形,内存中找到网络数据,按照网络协议栈,对数据进行逐层解析和处理,直到送给应用。
软中断信号环形,内存中找到网络数据,按照网络协议栈,对数据进行逐层解析和处理,直到送给应用。
上半部会打断 CPU 正在执行的任务,然后立即执行中断处理程序。
而下半部以内核线程的方式执行,并且每个 CPU 都对应一个软中断内核线程,名字为 “ksoftirqd/CPU 编号”,
比如说, 0 号 CPU 对应的软中断内核线程的名字就是 ksoftirqd/0。
而下半部以内核线程的方式执行,并且每个 CPU 都对应一个软中断内核线程,名字为 “ksoftirqd/CPU 编号”,
比如说, 0 号 CPU 对应的软中断内核线程的名字就是 ksoftirqd/0。
内核自定义事件属于软中断,比如内核调度和 RCU 锁(Read-Copy Update)
ps aux | grep softirq
一般来说,ps 的输出中,名字括在中括号里的,一般都是内核线程。
一般来说,ps 的输出中,名字括在中括号里的,一般都是内核线程。
查看软中断和内核线程
#软中断 /proc/softirqs
#硬中断 /proc/interrupts
#硬中断 /proc/interrupts
软中断以内核线程方式运行,每个 CPU 都对应一个软中断内核线程(ksoftirqd/CPU编号)
ps 的输出中,名字括在中括号里的,一般都是内核线程。
10 案例篇:系统的软中断CPU 使用率升高
案例
sar:系统活动报告工具,既可实时查看系统的当前活动,又可以配置保存和报告历史统计数据
hping3:是一个可以构造 TCP/IP协议数据包的工具,可以对系统进行安全审计、防火墙测试。
tcpdump 常用网络抓包工具,常用来分析各种网络问题。
分析
使用 hping3 这样的工具制造 SYNCFLOOD 攻击;
step1:watch -d cat /proc/softirqs # 查看到网卡发生的软中断比较高
step2:sar -n DEV 1 # -n DEV 表示网络首发报告,间隔1 秒,查看流量具体数值
step3:tcpdump -i eth0 -n tcp port 80 # -i eth0 只抓取 eth0 网卡,-n 不解析协议名和主机名
step1:watch -d cat /proc/softirqs # 查看到网卡发生的软中断比较高
step2:sar -n DEV 1 # -n DEV 表示网络首发报告,间隔1 秒,查看流量具体数值
step3:tcpdump -i eth0 -n tcp port 80 # -i eth0 只抓取 eth0 网卡,-n 不解析协议名和主机名
11 套路篇:迅速分析出系统 CPU 的瓶颈
CPU 性能指标
CPU 使用率
用户 CPU 使用率
系统 CPU 使用率
等待I/O的 CPU 使用率
虚拟化环境中会用到的盗取 CPU 使用率和客户 CPU使用率
平均负载
系统平均活跃进程数
进程上下文切换
自愿上下文切换
非自愿上下文切换
性能指标
平均负载
uptime
mpstat
pistat
stress
上下文切换
vmstat
pidstat
sysbench
进程 CPU 使用率高
top
perf top
系统 CPU 使用率高
top
pidstat
perf record/perf report
execsnoop
不可中断和僵尸进程
top
dstat
strance
软中断
/proc/softirqs
sar
tcpdump
性能指标和性能工具联系
12 套路篇:CPU 性能优化的几个思路
评估性能优化效果
确定性能的量化目标
测试优化前的性能指标
测试优化后性能指标
不局限在唯一指标上
应用程序:吞吐量和请求延迟
系统资源:CPU 使用率
多种优化方法如何选择
DPDK是一种优化网络处理速度的方法,它通过绕开内核网络协议栈的方法,提升网络的处理能力。
需要独占一个 CPU 以及一定数量的内存大页,并且总是以 100%的 CPU 使用率运行,CPU 核数少就得不偿失了。
需要独占一个 CPU 以及一定数量的内存大页,并且总是以 100%的 CPU 使用率运行,CPU 核数少就得不偿失了。
CPU优化
编译器优化
gcc 提供了优化选项 -O2
算法优化
复杂度更低的算法
异步处理
把轮询替换为事件通知,就可以避免轮询耗费 CPU 的问题
多线程代替多进程
善用缓存
系统优化
CPU绑定
提高 CPU 缓存命中率,减少跨 CPU 调度带来上下文切换
CPU 独占
进一步将 CPU 分组,并通过 CPU 亲和性机制为其分配进程,这些 CPU 就有指定的进程独占。
优先级调整
为进程设置资源限制
通过 Linux cgroups 来设置进程的 CPU 使用上限。
NUMA(Non-Uniform Memory Access)优化
支持 NUMA 的处理器会被划分为多个 node,每个 node 都有自己的本地内存空间。
中断负载均衡
无论是软中断还是硬中断,中断程序都可能耗费大量 CPU。开启irqbalance服务或者配置smp_affinity可以把中断处理过程自动负载到多个 CPU 上。
13 Linux 性能优化答疑(一)
14 Linux性能优化答疑(二)
15 基础篇:Linux 内存是怎么工作的
内存映射
并不是所有的虚拟内存都会分配物理内存,只有那些实际使用的虚拟内存才分配物理内存,并且分配后的物理内存,是通过内存映射来管理的。
内存映射,其实就是将虚拟内存地址映射到物理内存地址。
为了完成内存映射,内核为每个进程都维护了一张页表,记录虚拟地址与物理地址的映射关系,
为了完成内存映射,内核为每个进程都维护了一张页表,记录虚拟地址与物理地址的映射关系,
页表实际上存储在 CPU 的内存管理单元 MMU 中,处理器就可以直接通过硬件,找出要访问的内存。
TLB 其实是 MMU 中页表的高速缓存
TLB 其实是 MMU 中页表的高速缓存
MMU 并不以字节为单位来管理内存,而是规定了一个内存映射的最小单位,也就是页,通常是 4 KB 大小。
这样,每一次内存映射,都需要关联 4 KB 或者 4KB 整数倍的内存空间。
这样,每一次内存映射,都需要关联 4 KB 或者 4KB 整数倍的内存空间。
因为页表比较多,Linux 提供两种机制:多级页表和大页(HugePage)
多级页表
大页
2MB 和 1GB
虚拟内存空间分布
1. 只读段,包括代码和常量
2. 数据段,包括全局变量
3. 堆,包括动态分配的内存,从低地址开始向上增长
4. 文件映射段,包括动态库、共享内存,高地址向下增长
5.栈,局部变量和函数调用的上下文等,栈大小固定,一般 8MB
内存分配和回收
小块内存(小于 128K)
brk()来分配
可以减少却也异常发生,提高内存访问效率。内存未归还系统,繁忙时频繁的分配释放造成碎片。
大块内存(大于 128K)
直接使用内存映射 mmap() 来分配,每次 mmap 都会发生却也异常,内核负担较大。
这些内存,都只在首次访问时才分配,通过缺页异常进入内核中,再由内核来分配内存。
Linux 通过 slab 分配器来管理小内存,构建在伙伴系统上的一个缓冲,主要作用就是分配并释放内核中小对象。
回收内存
LRU(Least Recently Used)算法,回收最近使用最少的内存页。
回收不常访问的内存,把不常用的内存通过交换分区写到磁盘中
通常只在内存不足时,才会发生 Swap 交换。并且由于磁盘读写的速度远比内存慢,Swap 会导致严重的内存性能问题
通常只在内存不足时,才会发生 Swap 交换。并且由于磁盘读写的速度远比内存慢,Swap 会导致严重的内存性能问题
杀死进程,内存紧张通过 OOM(Out of Memory),直接沙雕占用大量内存的进程。
echo -16 > /proc/$(pidof sshd)/oom_adj
oom_adj 的范围是[-17,15],数值越大越容易被OOM 杀死,-17 禁止 OOM。
echo -16 > /proc/$(pidof sshd)/oom_adj
oom_adj 的范围是[-17,15],数值越大越容易被OOM 杀死,-17 禁止 OOM。
如何查看内存
free
available:新进程可以使用的内存大小,不仅包含未使用内存还包括可回收的缓存,所以比未使用内存大。
top
VIRT:进程虚拟内存的大小,只要是进程申请过的内存,即便没有分配物理内存也算
RES:常驻内存大小,实际使用的物理内存,不包括 Swap 和共享内存
SHR:共享内存的大小,比如与其他进程共同使用的共享内存、加载的动态链接库及程序代码段。
%MEM:进程使用物理内存占系统总内存百分比
16:基础篇:怎么理解内存中的 Buffer 和 Cache
free 数据来源
/proc/meminfo
Buffers 内核缓冲区用到的内存,对应/proc/meminfo 中 Buffers 值
Cache 是内核页缓存和 Slab 用到的内存,对应的是 /proc/meminfo 中的 Cached 与 SReclaimable 之和。
案例
echo 3 > /proc/sys/vm/drop_caches
# 清理文件页、目录项、Inodes 等各种缓存
# 清理文件页、目录项、Inodes 等各种缓存
Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们既会用在读请求中,也会用在写请求中。
17: 案例篇:如何利用系统缓存优化程序的运行效率
缓存意义
写角度:不仅可以优化磁盘和文件的写入,对应用程序也有好处,在数据真正落盘之前,返回做其它工作。
读角度:不仅可以提高那些频繁访问数据的读取速度,也降低了频繁I/O对磁盘的压力。
缓存命中率
工具
cachestat 整个 OS 缓存的读写命中情况
cachetop 提供了每个进程的缓存命中情况
指定文件的缓存大小
pcstat
dd if=/dev/sda1 of=file bs=1M count=512 #生成一个 512M 的临时文件
echo 3 > /proc/sys/vm/drop_caches # 清理缓存
echo 3 > /proc/sys/vm/drop_caches # 清理缓存
18: 内存泄漏了,该如何定位和处理
malloc 申请虚拟内存后,并不会立即分配物理内存,首次访问时,才通过缺页异常陷入内核分配内存。
内存的分配和回收
只读段,程序的代码常量,不会泄露
数据段,全局变量和静态变量,不会泄露
内存映射,动态链接库和共享内存,共享内存由程序动态分配和管理,会泄露
示例
/usr/share/bcc/tools/memleak -a -p $(pidof app)
# -a 表示显示每个内存分配请求的大小以及地址
#-p 指定案例英勇的 pid
# -a 表示显示每个内存分配请求的大小以及地址
#-p 指定案例英勇的 pid
19: 为什么系统的 Swap 变高了(上)
导论
缓存和缓冲区,属于可回收内存。他们在内存干礼中,通常被叫做**文件页(**File-backed Page)
除此之外,通过内存映射获取的文件映射页,也是常见文件页。
除此之外,通过内存映射获取的文件映射页,也是常见文件页。
大部分文件页可以直接回收,以后需要再从磁盘读取。而那些被应用修改过,暂时还没写入磁盘的数据(脏页),先写磁盘,在释放内存。
两种写脏页方法
应用中通过fsync,把脏页同步到磁盘
交给系统,内核线程pdflush负责脏页刷新。
除文件页外,应用程序动态分配的堆内存,也就是匿名页(Anonymous Page),不能回收,如果很少被访问,暂存磁盘里。
Linux Swap 机制,把这些不常访问的内存先写到磁盘,释放这些内存给其他需要的进程使用,再次访问,重载入。
Linux Swap 机制,把这些不常访问的内存先写到磁盘,释放这些内存给其他需要的进程使用,再次访问,重载入。
Swap 原理
换入与换出
换出就是把进程暂时不用的内存数据存储到磁盘中,释放内存
换入就是进程再次访问这些内存的时候,把他们从磁盘读入内存。
休眠时基于 Swap 原理
场景
大块内存分配,不足,回收缓存。
专门的内核线程定期回收内存,也就是kswapd0.
调配
小于页最小阀值:只有内核可以分配内存
最小阀值与低阈值中间:kswapd0 会执行内存回收,直到剩余内存大于高阈值为止。
页低阈值和页高阈值:有一点压力,可以满足分配要求。
大于页高阈值:无压力
通过内核调整阈值大小:/proc/sys/vm/min_free_kbytes设置。min_free_kbytes设置页最小阈值。
其它两个值根据页最小阈值计算生成。
其它两个值根据页最小阈值计算生成。
NUMA 与 Swap
多个处理器被划分到不同 Node 上,每个 Node 拥有自己的本地内存空间。
同一个 Node 内部的内存空间,可以划分为内存誉(Zone),直接内存访问(DMA),普通内存(NORMAL), 伪内存(MOVABLE)
同一个 Node 内部的内存空间,可以划分为内存誉(Zone),直接内存访问(DMA),普通内存(NORMAL), 伪内存(MOVABLE)
通过 /proc/zoneinfo 来查看不同 node使用情况
numactl --hardware 查看 node 概要
swappiness
分类
文件页回收,直接回收,或者脏页写回磁盘后再回收
匿名页回收,通过 Swap 机制,写入磁盘释放内存。
/proc/sys/vm/swapiness 调整使用 Swap 的积极程度。0-100
20: 为什么系统的 Swap 变高了(下)
案例
#创建 Swap 文件
fallocate -l 8G /mnt/swapfile
#修改权限只有根用户可以访问
chmod 600 /mnt/swapfile
# 配置 swap 文件
mkswap /mnt/swapfile
# 开启 swap
swapon /mnt/swapfile
fallocate -l 8G /mnt/swapfile
#修改权限只有根用户可以访问
chmod 600 /mnt/swapfile
# 配置 swap 文件
mkswap /mnt/swapfile
# 开启 swap
swapon /mnt/swapfile
21: 套路篇:如何“快准狠”找到系统内存的问题
系统内存指标
共享内存是通过tmpfs实现的,他的大小也就是tmpfs使用的内存大小。
tmpfs 其实也是一种特殊的缓存。
tmpfs 其实也是一种特殊的缓存。
可使用内存是进程可以使用的最大内存,包括剩余内存和可回收缓存。
缓存包括两部分,一部分是磁盘读取文件的页缓存,用来缓存从磁盘读取的数据,可以加快以后再次访问的速度。
另一部分,则是 Slab 分配器中的可回收内存。
另一部分,则是 Slab 分配器中的可回收内存。
缓冲区是对原始磁盘块的临时存储,用来缓存要写入磁盘的数据。
进程内存指标
虚拟内存:代码段、数据段、共享内存、已经申请的堆内存和已经换出的内存等。包括未分配空间
常驻内存:实际使用物理内存,不包括 Swap 和共享内存。
共享内存:包括与其他进程共同使用的真实的共享内存,包括加载动态链接以及程序代码段等
swap:通过 swap 换出到磁盘的内存。
22: Linux 性能优化答疑(三)
23:基础篇:Linux 文件系统是怎么工作的
索引节点和目录项
Linux 位每个文件分配两个数据结构,索引节点(index node)和目录项(directory entry)
索引节点,简称 inode,用来记录文件的元数据,比如 inode 编号、文件大小、访问权限、修改日期、数据的位置。
目录项,简称为 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的关系。多个关联的目录项,构成文件系统目录结构。
不同于索引节点,目录项是由内核维护的内存数据结构,也叫做目录项缓存。
不同于索引节点,目录项是由内核维护的内存数据结构,也叫做目录项缓存。
磁盘读写最小单位是扇区,512B大小。文件系统把连续的扇区组成逻辑块,每次都以逻辑块为最小单元管理数据,常为 4KB。
磁盘在执行文件系统格式化分成 3 个存储区域
超级块,存储整个文件系统状态。
索引节点区,存储索引
数据块区,用来存储文件数据
给予磁盘的文件系统,数据直接存储在计算机本地挂载的磁盘中。Ext4、XFS、OverlayFS
基于内存的文件系统, /proc, /sys
网络文件系统,也就是用来访问其它计算机数据的文件系统,比如 NFS、SMB、iSCSI
文件系统 I/O
缓冲与非缓冲I/O
缓冲:利用标准库缓存来加速文件访问,标准库内部通过系统调度访问文件。
非缓冲:直接通过系统调用来访问文件,不经过标准库。
系统调用会通过也缓存减少磁盘 IO
直接与非直接I/O
直接:跳过操作系统页缓存,直接跟文件系统交互访问文件。设定 O_DIRECT 标志
非直接:文件读写,先经过系统页缓存,再由内核或额外系统调用写入磁盘
阻塞与非阻塞I/O
阻塞:应用程序执行 IO,如果没有响应,阻塞线程。
非阻塞:应用程序不会阻塞当前线程,随后通过轮询或者事件形式获取调用结果。
访问管道或者网络套接字时,设置 O_NONBLOCK 标志
访问管道或者网络套接字时,设置 O_NONBLOCK 标志
同步与异步 I/O
同步:应用程序执行 I/O 操作后,要一直等到整个 I/O 完成后,才能获得 I/O 响应。
异步:应用程序执行 I/O 操作后,不用等待完成和完成后的响应,而是继续执行就可以。等到这次 I/O 完成后,响应会用事件通知的方式,告诉应用程序。
设置了 O_DSYNC,就要等文件数据写入磁盘后,才能返回;而 O_SYNC,则是在 O_DSYNC 基础上,要求文件元数据也要写入磁盘后,才能返回。
设置了 O_DSYNC,就要等文件数据写入磁盘后,才能返回;而 O_SYNC,则是在 O_DSYNC 基础上,要求文件元数据也要写入磁盘后,才能返回。
缓存
cat /proc/meminfo | grep -E "SReclaimable|Cached"
vmstat #可以查看cache 和 buffer 分别大小
vmstat #可以查看cache 和 buffer 分别大小
24: 基础篇: Linux 磁盘 IO 是怎么工作的
VFS
内部通过目录项、索引节点 、逻辑块以及超级块等数据结构,管理文件。
逻辑块:连续磁盘扇区构成的最小读写单元,用来存储文件数据。
目录项是一个内存缓存、而超级块、索引节点和偶几块都是存储在磁盘持久化数据。
磁盘
机械磁盘(Hard Disk Driver)
主要由盘片和读写磁头组成,数据就存储在盘片的环状磁道中。在读写数据前,需要移动读写磁头,定位到数据所在的磁道,然后才能访问数据。
固态磁盘(Solid State Disk)
无论机械磁盘,还是固态磁盘,相同磁盘的随机 I/O 都要比连续 I/O 慢很多.
连续 I/O 还可以通过预读的方式,来减少 I/O 请求的次数,这也是其性能优异的一个原因.
连续 I/O 还可以通过预读的方式,来减少 I/O 请求的次数,这也是其性能优异的一个原因.
最小读写单位
机械磁盘:最小读写单位是扇区,512 字节
固态磁盘:最小读写单位是页,通常 4KB、8KB。
存储介质
IDE(Integrated Drive Electronics)
hd
SCSI(Small Computer System Interface)
sd
SAS(Serial Attached SCSI)
SATA(Serial ATA)
sd
FC(Fibre Channel)
RAID(Redundant Array of Independant Disks)
是把多块磁盘组合成一个逻辑磁盘,构成冗余独立磁盘阵列
Linux 中,磁盘实际上是作为一个块设备来管理的,也就是以块为单位读写数据,并且支持随机读写。
每个块设备都会被赋予两个设备号,分别是主、次设备号。主设备号用在驱动程序中,用来区分设备类型;而次设备号则是用来给多个同类设备编号。
每个块设备都会被赋予两个设备号,分别是主、次设备号。主设备号用在驱动程序中,用来区分设备类型;而次设备号则是用来给多个同类设备编号。
通用块层
处在文件系统和磁盘驱动中间的一个块设备抽象层
跟虚拟文件系统的功能类似。向上,为文件系统和应用程序,提供访问块设备的标准接口;向下,把各种异构的磁盘设备抽象为统一的块设备,并提供统一框架来管理这些设备的驱动程序。
给文件系统和应用程序发来的 I/O 请求排队,并通过重新排序、请求合并等方式,提高磁盘读写的效率。
调度算法
NONE
25: 基础篇:Linux 磁盘 IO 是怎么工作的
磁盘性能指标
使用率:磁盘处理 I/O 的时间百分比。
饱和度:磁盘处理 I/O 的繁忙程度。
IOPS(Input/Output Per Second),是指每秒的 I/O 请求数。
吞吐量:每秒 IO 请求大小
响应时间:IO 请求到收到相应的间隔时间。
不同 I/O 大小(一般是 512B 至 1MB 中间的若干值)分别在随机读、顺序读、随机写、顺序写等各种场景下的性能情况
26:
27:
28:
29:
30
31:
32:
33:
34: 关于 Linux 网络,你必须知道这些
性能指标
带宽:链路最大传输速率,单位通常为 b/s (比特/秒)
吞吐量:单位时间内成功传输的数据量。吞吐量受带宽限制,而吞吐量/带宽,也就是该网络使用率。
延时:网络请求发出,一直到收到远端响应,所需要的时间延迟。
PPS(Packet Per Second)包/秒,网络包为单位的传输速率。
网络配置
正文
论点提出
论据陈述
论证过程

收藏
0 条评论
下一页