Linux 系统性能瓶颈分析
2024-03-29 18:02:58 0 举报
AI智能生成
Linux系统性能瓶颈分析
作者其他创作
大纲/内容
性能指标
进程
进程定义
在计算机网络领域中,进程是指正在运行的程序的实例。它是操作系统管理和分配资源的基本单位。每个进程都包含程序代码、数据、内存、寄存器和系统资源的集合,它们在内存中独立存在,相互隔离,互不干扰。
进程状态
创建
就绪
运行
阻塞
可中断睡眠进程
不可中断睡眠进程
挂起
终止
进程优先级
多用户
多任务
静态优先级
nice值
语法1<br>
语法2
动态优先级
进程与程序间的关系
程序
程序是一组指令和代码的集合,它是以某种编程语言编写的、用于完成特定任务的软件。程序是静态的,它通常存储在磁盘上,等待被执行。程序的典型示例包括编写的源代码文件、可执行二进制文件(已经编译并可以运行的程序)、脚本文件等。
进程
进程是程序的实际执行实例。当程序在计算机上运行时,操作系统会为它创建一个进程,分配资源(如内存、CPU时间、文件描述符等),并在计算机上执行程序的指令。每个进程都是独立的、有自己的内存空间和执行环境。多个进程可以同时运行,彼此独立。
进程与进程间的关系
父子进程关系
僵尸进程
孤儿进程
兄弟进程关系
并发进程关系
竞争条件和同步关系
进程间通信关系
管道
消息队列
信号
套接字
共享内存
进程间协作关系
进程间客户端-服务器关系
进程与线程的关系
进程和线程的定义
<b>进程</b>是程序的执行实例,它有独立的内存空间、资源和执行环境。每个进程都有自己的地址空间和系统资源,进程之间相互独立。
<b>线程</b>是进程内的一个执行单元,线程共享进程的内存空间和资源,因此多个线程可以在同一进程内并发执行。
资源分配和管理
<b>进程</b>需要独立的资源,如内存、文件描述符等,操作系统需要分配和管理这些资源,因此进程之间的资源隔离较强。
<b>线程</b>共享进程的资源,包括内存和文件句柄等。这使得线程之间的通信和数据共享更加容易,但也需要更小心地进行同步和互斥,以避免竞态条件和数据访问冲突。
创建和销毁开销
创建和销毁<b>进程</b>通常比较昂贵,因为它们需要分配和释放独立的资源。
创建和销毁<b>线程</b>的开销相对较小,因为它们共享进程的资源,不需要额外的资源分配。
并发性
<b>进程</b>之间的并发性较低,因为它们通常是相互独立的,通信和同步需要较复杂的机制。
<b>线程</b>之间的并发性较高,因为它们共享相同的内存空间,可以更容易地共享数据和通信。
故障容忍性
<b>进程</b>之间的故障通常不会相互影响,一个进程的崩溃不会导致其他进程崩溃。
<b>线程</b>之间的故障容忍性较低,因为它们共享相同的内存空间,一个线程的错误可能会影响整个进程的稳定性。
多核利用
<b>进程</b>在多核处理器上的并行执行可能需要更多的协调和通信开销。
<b>线程</b>更容易在多核处理器上并行执行,因为它们属于同一进程,可以充分利用进程的多个核心。
内存
物理内存与虚拟内存
地址空间(即内存)
程序的指令
数据
堆栈
共享库
其他资源
物理内存
逻辑内存
Swap Space
除了填补因物理内存不足的空缺外,还将会在适当的时候将物理内存中不经常读写的数据块自动交换到 Swap 交换空间
这个交换的策略由 Linux 系统内核定时执行
Linux 内核根据最近最少使用算法定时地将一些不经常使用的页面文件交换到 Swap。
交换空间中的数据在被读取时通常会首先被交换到物理内存,然后才能被程序访问,此时涉及2个知识点
页面缺失
页面调度
页高速缓存与页写回机制
页<br>
是Linux系统的内存单位
是物理内存或虚拟内存中一组连续的线性地址
大小通常是 4KB 或更大
页高速缓存
页高速缓存通常以页面的单位来存储数据
是操作系统在物理内存中维护的一个缓存,用于存储磁盘上的文件数据的副本
当一个文件的数据(内容)被读取时,操作系统将数据从磁盘读取到页高速缓存中,以便后续的读取操作可以更快速地访问数据
页写回机制
是一种优化技术,用于减少文件写入操作对性能的影响
当文件数据被修改并需要写回磁盘时,操作系统通常不会立即将数据写回磁盘,而是将数据标记为"脏",并将其保留在页高速缓存中。
操作系统通过一种策略,例如延迟写回或按需写回,决定何时将脏数据写回磁盘。
这允许操作系统将多个写操作合并,以减少磁盘写入的次数,提高性能。
文件系统
文件系统分类
本地文件系统
EXT
ext2
ext3
ext4
Btrfs
XFS
F2FS
网络文件系统
NFS
SMB
CIFS
虚拟文件系统
procfs
sysfs
tmpfs
特殊文件系统
虚拟化文件系统
日志文件系统
闪存文件系统
优化思路
分布式和集中式的访问
磁盘冗余阵列
RAID 0
RAID 1
RAID 5
RAID 6
RAID 10
磁盘 I/O
硬盘
硬盘驱动器
磁道
扇区
块
磁头
柱面
磁盘 I/O 调度策略
CFQ
Deadline
NOOP
BFQ
Kyber
MQ-DEADLINE
性能分析工具
CPU 性能分析工具
vmstat
语法
vmstat[选项][间隔时间][计数]
选项
-a, --active
-d, --disk
-p, --partition <dev>
-s, --stats
-m, --slabs
-t, --timestamp
间隔时间
计数
示例
不添加任何选项
<br>
每 2s 输出(采集)一次系统数据
<br>
每 2s 输出(采集)一次系统数据,共采集 5 次
<br>
字段输出解释(数据如示例截图)
procs
r 列
表示运行队列中的进程数,即当前正在运行的进程数。如果这个值长期大于系统 CPU 个数,说明 CPU 紧张,需进行CPU 升级(即增加系统 CPU)。
b 列
表示在等待资源的进程数,即处于不可中断(blocked)状态的进程数,通常是等待 I/O、内存交换完成的进程数。
memory
swpd 列
表示交换(swap)的虚拟内存使用量,表示从实际物理内存已经交换到交换空间的数据量,我这里的值为 0,因为我压根就没有启用 Swap Space。如果你启用了交换空间,发现swpd 列下的值很大,且 swap 字段下的 si、so 列的值长期为 0,这也不会影响系统性能。
free 列
表示当前可用的空闲物理内存。
buff 列
Buffers Cache,表示内存缓冲区缓存的数据量,一般对块设备的读写才需要缓冲(即通常用于文件I/O缓存)。
cache 列
Page Cache,表示内存的页高速缓存的数据量,一般作为文件系统的缓存(即通常用于文件系统缓存),频繁访问的文件都会被缓存,如果 cache 列的值比较大,说明页缓存的文件数较多,如果此时 io 字段中的 bi 列的值较小,说明文件系统效率较好。
swap
si 列
表示每秒从磁盘(即交换空间)交换到内存的数据量(swap in)(单位KB/s)。
so 列
表示每秒从内存交换到磁盘(即交换空间)的数据量(swap out)(单位KB/s)。
io
bi 列
表示每秒从块设备(磁盘)读取的块数量(blocks in)(单位KB/s)。
bo 列
表示每秒写入块设备(磁盘)的块数量(blocks out)(单位KB/s)。
system
in 列
每秒中断的数量,包括时钟中断、网络中断等。
cs 列
每秒上下文切换的数量,包括进程切换和内核线程切换。
cpu
us 列
用户空间占用CPU时间的百分比。如果长期大于 50%,就需要考虑优化程序或算法。
sy 列
内核空间占用CPU时间的百分比。如果 us + sy 长期大于 80%,说明 CPU 资源不足。
id 列
CPU空闲时间的百分比。
wa 列
等待 I/O 完成的CPU时间的百分比。wa 越高说明 IO 等待越严重,一般如果 wa 超过 20%,说明 IO 等待严重(可能是因为磁盘大量的随机读写造成)。
st 列
用于虚拟机监控程序(hypervisor)的CPU时间的百分比(仅在虚拟化环境中可见),因为我使用的就是虚拟机,所以我有这一列。
mpstat
语法
mpstat [选项] [间隔时间] [计数]
选项
-P
-I
间隔时间
计数
示例<br>
不添加任何选项
<br>
每 2s 输出(采集)一次系统数据
<br>
每 2s 输出(采集)一次系统数据,共采集 5 次,并指定采集具体 CPU
<br>
字段输出解释(数据如示例截图)
首行显示:操作系统版本和主机名, 当前 日期, 系统架构,CPU核心数量<br>
首列显示统计信息的时间戳
CPU
处理器的 ID 号,采集时不指定则默认为系统整体 CPU 情况(all 表示系统整体 CPU 情况,其他如 CPU 0、CPU 1 等)。
%usr
用户空间占用 CPU 时间的百分比。
%nice
优先级较高的用户空间占用 CPU 时间的百分比。
%sys
内核空间占用 CPU 时间的百分比。
%iowait
CPU 等待 I/O 操作完成的百分比。
%irq
CPU 处理硬件中断的百分比。
%soft
CPU 处理软件中断的百分比。
%steal
CPU 被虚拟机监控程序(hypervisor)"偷取"的百分比。
%guest
运行虚拟机中的操作系统时,CPU花费在虚拟机中的百分比。
%gnice
虚拟机中运行的优先级较高的用户空间占用CPU时间的百分比。
%idle
CPU空闲时间的百分比。
Average
平均值,如果指定了采集次数,系统自动为我们计算出相关字段的平均值。
uptime
<br>
09:29:15:是当前的系统时间,显示 小时:分钟:秒。
up 90 days, 7:13:是系统的运行时间。它表示系统自上次启动以来已经运行了90天7小时13分钟。
1 users:这是当前登录到系统的用户数量。
load average: 0.14, 0.10, 0.09 :这是系统的平均负载信息,它提供了系统的负载状态。分别表示过去1分钟、5分钟和15分钟内的系统负载情况。负载是指等待CPU资源的进程数量,所以这三个负载值一般不要长期超过系统的 CPU 核数,否则负载较高,影响系统性能(但不是绝对的,偶尔大于系统 CPU 核数也是每问题的)。
内存性能分析工具
free
语法
free [选项]
-b, --bytes
-k, --kilo
-m, --mega
-g, --giga
-t, --total
-h, --human
示列<br>
不添加任何选项<br>不带参数时默认选项为-k
<br>
人性化显示<br>
<br>
字段输出解释(数据如示例截图)
total
物理内存的总量,包括实际可用内存和内核保留的内存。
= used + free + buff/cache
used
已使用的物理内存量,包括用于进程和系统的内存。
free
空闲的物理内存量,尚未分配给任何进程。
shared
被共享的内存量,通常用于共享内存段的进程(如进程间通信机制)。
buff/cache
用于缓冲区和缓存的内存量。这包括Linux内核用于缓存文件系统数据的内存,以及用于文件I/O的内存缓冲区。
available
可用内存量,表示系统当前可供新进程使用的内存,包括缓冲区和缓存。
= buff/cache - shared - buffer + free<br>
一般地 20% < available < 70%,则系统内存资源基本能满足应用需求,暂时不影响系统性能。
smem
语法
smem [选项]
-r, --reverse
-u, --users
-U USERFILTER, --userfilter=USERFILTER
-P PROCESSFILTER, --processfilter=PROCESSFILTER
-s SORT, --sort=SORT
-k, --abbreviate
示例<br>
不添加任何选项
<br>
显示内存单位并指定字段进行排序
<br>
以百分比显示并指定字段进行排序
<br>
查看每个用户使用内存的情况
<br>
查看指定进程使用系统内存的情况
<br>
字段输出解释(数据如示例截图)
PID
进程ID
User
进程所属用户
Command
进程的命令行
Swap
进程占用的交换空间
USS
唯一内存使用(Unique Set Size),表示进程独占的内存
PSS
共享内存使用(Proportional Set Size),表示进程独占内存加上共享内存的平均值
RSS
物理内存使用(Resident Set Size),表示进程当前实际占用的物理内存
磁盘性能分析工具
iotop
语法
iotop [选项]
-o, --only
-b, --batch
-n NUM, --iter=NUM
-d SEC, --delay=SEC
-p PID, --pid=PID
-k, --kilobytes
示例
基础交互操作
<br>
以千字节显示
<br>
查看指定进程的 I/O 情况
<br>
字段输出解释(数据如示例截图)
TID
线程或进程的唯一标识符(Thread/Task ID),表示正在进行磁盘 I/O 操作的进程或线程的ID。
PRIO
进程的优先级(Priority),通常用于指示进程的执行优先级。
USER
执行磁盘 I/O 操作的用户的用户名。
DISK READ
磁盘读取速率,表示进程正在从磁盘读取数据的速度。以字节/秒(Bytes per Second)为单位显示。
DISK WRITE
磁盘写入速率,表示进程正在向磁盘写入数据的速度。以字节/秒为单位显示。
SWAPIN
表示进程从交换空间中读取数据的速率,通常用于虚拟内存操作。以字节/秒为单位显示。
IO>
磁盘 I/O 操作的总和,包括读取和写入。以百分比形式表示,表示磁盘 I/O 占用的总带宽。
COMMAND
正在进行磁盘 I/O 操作的进程或线程的命令名称。
键盘功能<br>
按键盘 O 键显示当前有 I/O 输出的进程
按键盘 <b><</b> 键 或<b>> </b>键进指定排序字段(默认基于 IO 字段来排序)
按键盘 P 键进行进程/线程的切换(默认显示的进程 PID 相关信息)
iostat
语法<br>
iostat [选项] [间隔时间] [次数]
选项
-c
-d
时间间隔
2:表示 2 秒
次数
5:表示输出 5 组数据
示例
显示 CPU 使用情况
<br>
显示磁盘 I/O 使用情况
<br>
指定间隔时间和次数
<br>
字段输出解释(数据如示例截图)
Device
磁盘设备的名称,表示正在监视的磁盘或分区。
tps
每秒传输的 I/O 操作次数(Total I/O Transactions Per Second)。这个值表示每秒完成的读取和写入磁盘的总操作数。
kB_read/s
每秒从磁盘读取的数据量(Kilobytes Read Per Second)。这个值表示每秒从磁盘读取的数据量,以千字节(KB)为单位。
kB_wrtn/s
每秒写入磁盘的数据量(Kilobytes Written Per Second)。这个值表示每秒写入磁盘的数据量,以千字节(KB)为单位。
kB_read
自系统启动以来从磁盘读取的总数据量(Kilobytes Read)。这个值表示自系统启动以来累积的总读取数据量,以千字节(KB)为单位。
kB_wrtn
自系统启动以来写入磁盘的总数据量(Kilobytes Written)。这个值表示自系统启动以来累积的总写入数据量,以千字节(KB)为单位。
网络性能分析工具
ping
语法
ping [选项] 目标主机
选项
-c
-i
-s
示例<br>
基本用法
<br>
指定发送报文数量
<br>
字段输出解释(数据如示例截图)
PING
这是 ping 命令的第一行,显示正在执行的 ping 命令以及目标主机的 IP 地址或主机名。
bytes
每个 ICMP 报文的大小,通常默认为 64 字节。
icmp_seq
ICMP 报文的序列号,从 0 开始递增。
ttl
生存时间(Time to Live),表示报文在网络上能够存活的跳数(路由器数量)。
time
每个 ICMP 报文的往返时间(Round-Trip Time,RTT),以毫秒为单位。这是从发送 ICMP 报文到接收响应所经过的时间。
packets transmitted
发送的 ICMP 报文数量,表示发送的次数。
packets received
接收的 ICMP 响应报文数量,表示成功收到的次数。
packet loss
丢失的 ICMP 报文数量,表示未收到响应的次数,通常以百分比形式显示。
time
用于显示 RTT 的统计信息,通常包括最小、最大和平均 RTT 时间。
0 条评论
下一页