目录
1.top/atop/htop名命令:查看进程、CPU、内存的情况
2.dstat 2:查看CPU、磁盘IO、网络IO、换页、中断、切换,系统I/O状态;
3.iostat -d -x 2 查看所有磁盘的IO情况,系统I/O状态;
5.perf top查看占用CPU最多的函数,CPU使用情况
7./usr/sbin/filetop-bpfcc -C 查看每个文件的读写情况,系统的I/O状态;
9.ps aux --sort=-%cpu 按CPU使用率排序,找出CPU消耗最多进程;
优化内核参数--最大打开文件数&最大进程数(fs.file-max)
优化内核参数--网络连接跟踪表大小(net.netfilter.nf_conntrack_max)
优化内核参数--TCP 最大缓冲区大小 (net.ipv4.tcp_rmem, net.ipv4.tcp_wmem)
优化内核参数--共享内存大小 (kernel.shmmax)
优化内核参数--网络接口队列长度 (net.core.netdev_max_backlog)
优化内核参数--系统内存回收频率 (vm.swappiness)
优化内核参数--系统内存回收频率 (vm.dirty_ratio, vm.dirty_background_ratio)
性能调优五大维度-思维导图
CPU
内存
存储设备
文件系统
网络
整体排查
整体排查:主要是关注CPU、内存、磁盘、文件系统等的使用率,是否存在负载过高或延迟大的情况,有没发成错误等。借助不同的工具来分析定位问题所在。
在Linux系统中实际保存着CPU、内存、swap、进程等信息,top/atop等工具只是把其中的信息展示出来。 信息存放在/proc目录下(/proc
目录是一个伪文件系统,它提供了一个接口来访问内核和进程的信息。包括:/proc/cpuinfo、/proc/loadavg、/proc/meminfo、/proc/net/等等
)
查看系统的整体状态,常用命令:
1.top/atop/htop名命令:查看进程、CPU、内存的情况
atop
是一个高级系统和进程监控工具,用于查看和分析 Linux 系统的性能数据。常用于分析性能瓶颈、监控资源利用率、异常行为检测、历史数据分析
cpu | sys 0% | user 0% | irq 0% | idle 99% | cpu001 w 0% | steal 0% | guest 0% | | ipc notavail | cycl unknown | curf 2.20GHz | curscal ?% |
sys,0%
: 在系统模式(内核模式)下运行的 CPU 时间百分比。user,0%
: 在用户模式下运行的 CPU 时间百分比
irq,0%
: 处理硬件中断的 CPU 时间百分比
idle,99%
: CPU 处于空闲状态的时间百分比
cpu001 w 0%
: 表示 CPU 编号(如 CPU 1)正在等待任务的时间百分比
steal,0%
: 被其他虚拟机或容器窃取的 CPU 时间百分比
guest,0%
: 运行虚拟 CPU 的时间百分比
ipc,notavail
: 每周期指令数(Instructions Per Cycle, IPC)不可用
cycl,unknown
: CPU 时钟周期数据未知
curf,2.20GHz
: 当前 CPU 频率为 2.20 GHz
curscal,?%
: 当前 CPU 频率相对于基准频率的比例(缩放)
C语言编程,可能导致CPU占用率高/繁忙的场景有:a.滥用无限循环 b.频繁的系统调用 c.糟糕的算法和数据结构(太多循环条件套循环条件) d.高频率定时器,导致CPU不断地处理中断
top是一个实时的任务管理器和系统监视工具
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10 root 20 0 0 0 0 I 0.3 0.0 0:01.30 rcu_sched
1. PID: 进程标识符 (Process ID),进程的 PID 是 10
2. USER: 进程所属用户,进程是由 root 用户启动的。
3. PR: 进程优先级 (Priority),20 是 Linux 系统默认的优先级
4. NI: 进程的 nice 值,0 表示没有修改优先级。
5. VIRT: 进程使用的虚拟内存总量 (Virtual Memory)
- `0`: 这个进程当前使用的虚拟内存大小为 0 KB。这通常表明这是一个内核线程,不使用用户空间的虚拟内存。6. RES: 进程使用的常驻内存大小 (Resident Memory)
- `0`: 这个进程当前使用的常驻内存大小为 0 KB。这通常表明这是一个内核线程,不使用用户空间的内存。7. SHR: 进程使用的共享内存大小 (Shared Memory)
- `0`: 这个进程当前使用的共享内存大小为 0 KB。8. S: 进程状态 (State)
- `I`: 进程状态为 I,表示它处于空闲(Idle)状态。在某些 `top` 实现中,`I` 也表示 `Interruptible sleep`,但在这个上下文中,它更可能表示 Idle。9. %CPU 进程使用的 CPU 百分比,0.3`: 这个进程使用了 0.3% 的 CPU 资源。
10. %MEM: 进程使用的物理内存百分比
- `0.0`: 这个进程使用了 0.0% 的物理内存。11. TIME+: 进程运行的总 CPU 时间
- `0:01.30`: 这个进程自启动以来累计使用了 1.30 秒的 CPU 时间。12. COMMAND: 运行的命令或进程名
- `rcu_sched`: 这个进程的名称或启动的命令。`rcu_sched` 是 Linux 内核中的一个关键线程,用于 RCU(Read-Copy-Update)机制,它帮助管理内核数据结构的并发访问。
htop
是 top
的增强版,它提供了一个更友好的用户界面和更多的功能来监控系统资源和管理进程
以进度条的的方式列出所有CPU、内存、交换区目前的使用情况;也罗列进程的情况,和上面top命令的指标差不多!
2.dstat 2:
查看CPU、磁盘IO、网络IO、换页、中断、切换,系统I/O状态;
2代表:每隔两秒更新
usr sys idl wai stl| read writ| recv send| in out | int csw
1 1 98 0 0| 316M 709M| 0 0 | 0 0 | 447k 630k
usr sys idl wai stl: CPU 使用情况
- usr (User): 1% - 用户空间使用的 CPU 时间百分比。
- sys (System): 1% - 内核空间使用的 CPU 时间百分比。
- idl (Idle): 98% - CPU 空闲时间百分比。
- wai (I/O Wait): 0% - CPU 等待 I/O 操作完成的时间百分比。
- stl (Steal): 0% - 被虚拟化超管程序“偷走”的时间百分比。
read writ: 磁盘 I/O
- read: 316M - 从磁盘读取的数据量。
- writ: 709M - 写入磁盘的数据量。
recv send: 网络 I/O
- recv: 0 - 接收的数据量(网络接口)。
- send: 0 - 发送的数据量(网络接口)。
in out: 系统中断和上下文切换
- in (Interrupts): 0 - 每秒发生的中断数。
- out (Context Switches): 0 - 每秒发生的上下文切换数。
int csw: 系统中断和上下文切换
- int: 447k - 每秒发生的中断数。
- csw: 630k - 每秒发生的上下文切换数。
3.iostat -d -x 2 查看所有磁盘的IO情况,系统I/O状态;
Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz d/s dkB/s drqm/s %drqm d_await dareq-sz aqu-sz %util
sda 2.24 105.15 0.58 20.55 5.05 46.99 18.51 226.38 2.94 13.70 1.06 12.23 0.00 0.00 0.00 0.00 0.00 0.00 0.02 1.12
Device: 设备名称,例如,
sda
,表示第一个 SCSI 磁盘。r/s: 每秒读请求数
rkB/s: 每秒读的千字节数
rrqm/s: 每秒合并的读请求数
%rrqm: 读请求合并百分比
- 计算公式为
(rrqm/s) / (r/s + rrqm/s) * 100
。r_await: 读请求的平均等待时间(以毫秒为单位)
rareq-sz: 平均读请求大小(以千字节为单位)
w/s: 每秒写请求数
wkB/s: 每秒写的数据量(千字节数)
wrqm/s: 每秒合并的写请求数
%wrqm: 写请求合并百分比
- 合并写请求的比例,计算公式为
(wrqm/s) / (w/s + wrqm/s) * 100
。w_await: 写请求的平均等待时间(毫秒)
wareq-sz: 平均写请求大小(千字节为单位)
d/s: 每秒丢弃的请求数(通常为 0)
dkB/s: 每秒丢弃的千字节数(通常为 0)
drqm/s: 每秒合并的丢弃请求数(通常为 0)
%drqm: 丢弃请求合并百分比(通常为 0)
d_await: 丢弃请求的平均等待时间(通常为 0)
dareq-sz: 平均丢弃请求大小(通常为 0)
aqu-sz: 平均 I/O 队列长度
%util: 设备利用率(设备繁忙的时间百分比。如果这个值接近 100%,说明设备已经饱和)
4.iotop
查看IO靠前的进程,系统的I/O状态
iotop
是一个用于监视 Linux 系统中 I/O 活动的工具,特别是显示哪些进程或线程正在占用大量的磁盘 I/O
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init maybe-ubiqu
TID: 线程标识符 (Thread ID)
PRIO: 优先级 (Priority),优先级是
be/4
,其中be
表示 “best-effort” 调度策略,4
表示优先级级别。USER: 用户 (User
DISK READ: 磁盘读取 (Disk Read),当前读取磁盘的速率(每秒读取的字节数)
DISK WRITE: 磁盘写入 (Disk Write),当前写入磁盘的速率(每秒写入的字节数)
SWAPIN: 交换内存使用 (Swap In),当前交换内存活动的百分比。
IO>: I/O 优先级 (I/O Priority),当前 I/O 活动的百分比。
COMMAND: 命令 (Command),运行进程或线程的命令或命令行
5.perf top
查看占用CPU最多的函数,CPU使用情况
perf
工具是性能分析工具的集合,用于收集系统各个层面的性能数据和统计信息。
perf top用于实时监视系统中占用 CPU 时间最多的进程和函数。结果如下:
Overhead Shared Object Symbol
10.78% [kernel] [k] format_decode
10.62% [kernel] [k] number
9.73% [kernel] [k] vsnprintf
6.14% [kernel] [k] kallsyms_expand_symbol.constprop.0
5.63% [kernel] [k] string_nocheck
4.53% [kernel] [k] memcpy_orig
format_decode
函数的作用是解析和转换输入数据,将其转换成另一种格式memcpy_orig
函数在 Linux 内核中的作用是执行内存数据的复制操作
其它用法:
进行性能数据采集和报告生成的操作,查看CPU事件占比,调用栈,CPU使用情况;
perf record -ag -- sleep 15;perf report
Children Self Command Shared Object Symbol
+ 99.51% 0.00% swapper [kernel.kallsyms] [k] secondary_startup_64
+ 99.51% 0.00% swapper [kernel.kallsyms] [k] cpu_startup_entry
解释如下:
Children: 表示被观察的进程及其子进程的总体执行时间百分比
Self: 表示这些时间中直接由进程本身(或主线程)执行的时间百分比Command:表示被监控的进程或命令的名称(
swapper
, Linux 内核中负责管理任务调度的一个特定进程)Shared Object: 显示执行过程中涉及的共享对象(通常是库文件或内核模块)
Symbol: 是共享对象中具体函数或符号的名
[k]:表示这些符号来自内核空间(kernel space)
secondary_startup_64、cpu_startup_entry是具体的函数名或符号名
小结:
swapper
进程(或调度器)及其子进程在执行过程中,大部分时间都花费在内核启动的相关函数调用上,具体来说是secondary_startup_64
和cpu_startup_entry
这两个函数。
6.sar -n DEV 1 5
查看网卡的吞吐,网卡状态;
sar
命令是一个系统性能监测工具,用于在 Linux 系统上收集、报告和保存各种系统活动数据,包括 CPU 使用情况、内存使用、磁盘 I/O、网络活动等
通过 sar
命令,系统管理员可以及时了解系统资源的使用情况和趋势变化(一般通过定时任务cronjob来保存数据,然后sar可以查看特定时间段内系统资源的使用情况),有助于优化系统配置和提升性能
sar -n DEV 1 5
查看网卡的吞吐,网卡状态;
1:每秒钟采集一次网络设备的数据传输情况
5:持续采集 5 次
root@fred-1:/home/fred-1# sar -n DEV 1 5
Linux 5.4.0-186-generic (fred-1) 06/27/2024 _x86_64_ (2 CPU)
02:19:36 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
02:19:37 PM ens160 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:19:37 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:19:37 PM ens192 1.00 8.00 0.06 0.86 0.00 0.00 0.00 0.00
- 02:19:36 PM: 采样时间。
- IFACE: 网络接口名称,例如
ens160
、lo
和ens192
。- rxpck/s: 每秒接收的包数 (received packets per second)。
- txpck/s: 每秒发送的包数 (transmitted packets per second)。
- rxkB/s: 每秒接收的千字节数 (received kilobytes per second)。
- txkB/s: 每秒发送的千字节数 (transmitted kilobytes per second)。
- rxcmp/s: 每秒接收的压缩包数 (received compressed packets per second)。
- txcmp/s: 每秒发送的压缩包数 (transmitted compressed packets per second)。
- rxmcst/s: 每秒接收的多播包数 (received multicast packets per second)。
- %ifutil: 网络接口利用率百分比 (interface utilization percentage),显示接口带宽的利用率
7./usr/sbin/filetop-bpfcc -C
查看每个文件的读写情况,系统的I/O状态;
TID COMM READS WRITES R_Kb W_Kb T FILE
498 systemd-journal 2 0 4095 0 R cmdline
- TID: 线程标识符 (Thread ID)
COMM: 命令 (Command),正在执行的进程或线程的名称。
READS: 读取操作次数
WRITES: 写入操作次数
R_Kb: 读取的字节数(以 KB 为单位)
W_Kb: 写入的字节数(以 KB 为单位)
T FILE: 类型和文件路径,读取或写入操作的文件类型和文件路径
其它用法:
显示正在被打开的文件,系统的I/O状态;
/usr/sbin/opensnoop-bpfcc
PID COMM FD ERR PATH
722 multipathd 9 0 /sys/devices/pci0000:00/0000:00:10.0/host32/target32:0:0/32:0:0:0/state
PID: 进程 ID, PID 722,对应进程
multipathd
。COMM: 命令名称,执行进程的名称
FD: 文件描述符,
预定义的标准文件描述符:标准输入 (stdin): 文件描述符 0,用于读取输入数据。标准输出 (stdout): 文件描述符 1,用于写入输出数据。标准错误 (stderr): 文件描述符 2,用于写入错误消息
ERR: 错误号, 0,表示没有错误。
PATH: 文件路径,文件系统中打开文件的路径
8.mpstat -P ALL 1
单核CPU是否被打爆;
mpstat::是一个用于多处理器系统性能监控工具,用于报告每个处理器或处理器组件的使用情况
-P ALL:显示所有 CPU 核心的使用情况
1: 指定输出的频率,即每隔1秒更新一次数据
02:48:54 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
02:48:55 PM all 0.00 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 99.50
02:48:54 PM / 02:48:55 PM: 表示数据采样的时间点。每秒采样一次,第一行是开始采样时间,第二行是采样数据。
CPU: 表示 CPU 核心的编号或
all
表示所有 CPU 核心的平均值。%usr: 用户空间进程消耗的 CPU 时间百分比。这里是 0.00%,表示用户空间进程几乎没有消耗 CPU 时间。
%nice: 改变过优先级的用户进程消耗的 CPU 时间百分比。这里是 0.00%,表示没有改变过优先级的用户进程消耗 CPU 时间。
%sys: 内核空间进程消耗的 CPU 时间百分比。这里是 0.50%,表示内核进程消耗了 0.50% 的 CPU 时间。
%iowait: CPU 等待 I/O 操作完成的时间百分比。这里是 0.00%,表示 CPU 没有花费时间等待 I/O 操作。
%irq: CPU 处理硬件中断的时间百分比。这里是 0.00%,表示没有硬件中断消耗 CPU 时间。
%soft: CPU 处理软件中断的时间百分比。这里是 0.00%,表示没有软件中断消耗 CPU 时间。
%steal: 虚拟化环境中,CPU 被其他虚拟机偷走的时间百分比。这里是 0.00%,表示没有 CPU 时间被其他虚拟机偷走。
%guest: 运行虚拟 CPU 时消耗的 CPU 时间百分比。这里是 0.00%,表示没有运行虚拟 CPU。
%gnice: 改变过优先级的虚拟 CPU 时间百分比。这里是 0.00%,表示没有改变过优先级的虚拟 CPU 时间。
%idle: CPU 空闲时间百分比。这里是 99.50%,表示 CPU 大部分时间处于空闲状态
9.ps aux --sort=-%cpu
按CPU使用率排序,找出CPU消耗最多进程;
root@fred-1:/home/fred-1# ps aux --sort=-%cpu
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 774 0.1 0.3 236916 7904 ? Ssl 12:08 0:11 /usr/bin/vmtoolsd
root 1 0.0 0.6 103952 12920 ? Ss 12:08 0:04 /sbin/init maybe-ubiquity
root 2 0.0 0.0 0 0 ? S 12:08 0:00 [kthreadd]
10.ps命令
统计前20内存占用;
ps -eo pid,comm,rss | awk '{m=$3/1e6;s["*"]+=m;s[$2]+=m} END{for (n in s) printf"%10.3f GB %s\n",s[n],n}' | sort -nr | head -20
root@fred-1:/home/fred-1# ps -eo pid,comm,rss | awk '{m=$3/1e6;s["*"]+=m;s[$2]+=m} END{for (n in s) printf"%10.3f GB %s\n",s[n],n}' | sort -nr | head -20
0.318 GB *
0.031 GB snapd
0.027 GB systemd-journal
0.023 GB systemd
0.022 GB sshd
11.
统计/proc/slabinfo文件内(即
内核)前20 slab 的占用;
awk 'NF>3{s["*"]+=s[$1]=$3*$4/1e6} END{for (n in s) printf"%10.1f MB %s\n",s[n],n}' /proc/slabinfo | sort -nr | head -20
slab:在 Linux 内核中,slab 分配器是一种内存管理机制,用于高效地管理内核对象的分配和释放。Slab 分配器通过预先分配一些小的内存块来减少内存碎片,并提高分配内存的速度。
root@fred-1:/home/fred-1# awk 'NF>3{s["*"]+=s[$1]=$3*$4/1e6} END{for (n in s) printf"%10.1f MB %s\n",s[n],n}' /proc/slabinfo | sort -nr | head -20
135.8 MB *
25.0 MB ext4_inode_cache
15.8 MB inode_cache
12.7 MB dentry
要优化系统的 slab 分配器性能的方式:
调整内核参数,根据系统的具体需求,调整内核参数。例如,可以调整 min_free_kbytes
参数,确保系统有足够的内存用于 slab 缓存。
sysctl -w vm.min_free_kbytes=65536
优化系统配置,确保系统的内存和 CPU 资源配置合理
进程分析,进程占用的资源
pidstat是Linux系统中的一个性能监控工具,提供了详细的进程级别的 CPU 使用率、内存使用情况、I/O 操作、任务切换等信息。
pidstat 2 -p pid;
查看可疑进程CPU使用率变化情况;
pidstat -w -p pid 2;
查看可疑进程的上下文切换情况;
pidstat -d -p pid 2;
查看可疑进程的IO情况
lsof
(List Open Files) 是一个用于列出系统中所有打开文件的工具
lsof -p pid;
查看进程打开的文件;
strace是一款用于跟踪和调试程序执行过程中系统调用的工具 ,可以记录一个进程执行的所有系统调用及其参数和返回值
strace -f -T -tt -p pid;
显示进程发起的系统调用;
常见的系统调用:
1.文件和目录操作:open()、read()、mkdir()等
2.进程控制:fork()创建进程、wait()等待子进程结束
3.网络通信:socket()、bind()、listen()
协议栈分析,连接/协议栈状态(网络)
1.查看网卡硬件情况:ethtool -S device_name
netstat用于显示网络状态信息的命令行工具,显示连接状态、连接队列、协议栈、网络信息,路由表、接口统计等信息
2.查看连接状态分布:netstat -nat | awk '{print $NF}' | sort | uniq -c | sort -n
输出结果:(解释:1个连接处于established状态;3个连接处于LISTEN(监听)状态)
1 established
1 State
2 ESTABLISHED
3 LISTEN
3.查看连接队列:
netstat -ntp
root@fred-1:/proc/net# netstat -ntp Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 240 10.10.1.200:22 10.10.1.104:50698 ESTABLISHED 3439/sshd: fred-1 [ tcp 0 0 10.10.1.200:22 10.10.1.104:51121 ESTABLISHED 5075/sshd: fred-1 [
4.查看协议栈情况:netstat -s
根据IP、ICMP、TCP、UDP等协议或协议栈,分别统计发出去的包、接收的包、丢弃的包等等信息,不同协议有有不同;
分析方法论
RED方法:监控服务的请求书(Request)、错误数(Error)、响应时间(Duration)
USE方法:监控系统资源的使用率(Utilization)、饱和度(Saturation)、错误数(Errors)
如果用来分析CPU、内存、存储设备、文件系统、网络五大维度,细节如下:
资源 | 类型 | 性能指标 |
CPU | 使用率 | CPU使用率(命令:top/htop/atop等) |
CPU | 饱和度 | 运行队列长度或平均负载(top命令-load average) 或者(cat /proc/loadavg)获取负载平均值和运行队列长度 |
CPU | 错误数 | 硬件CPU错误数 |
其它command:mpstat -P ALL 1 查看
单核CPU是否被打爆
ps aux --sort=-%cpu
按CPU使用率排序,找出CPU消耗最多进程;
perf top
查看占用CPU最多的函数
资源 | 类型 | 性能指标 |
内存 | 使用率 | 已用内存百分比/已用交换区百分比(命令:top/atop/free -m等) |
内存 | 饱和度 | 内存换页量(命令:top查看swap) |
内存 | 错误数 | 内存分配失败或oom(out of memory)(命令:ps 排序查看内存用最多的/top等;分析也可看dmesg/journalctl) |
内存换页量:通常是系统在内存和磁盘之间进行页面调度的活动量;换页通常发生在内存不足的情况下,将不常用的内存页面移到交换空间,腾出内存供进程使用!
其它command:
ps命令
统计前20内存占用;
ps -eo pid,comm,rss | awk '{m=$3/1e6;s["*"]+=m;s[$2]+=m} END{for (n in s) printf"%10.3f GB %s\n",s[n],n}' | sort -nr | head -20
内核参数调优:
要优化系统的 slab 分配器性能的方式:
调整内核参数,根据系统的具体需求,调整内核参数。例如,可以调整
min_free_kbytes
参数,确保系统有足够的内存用于 slab 缓存。
sysctl -w vm.min_free_kbytes=65536
内核参数调优:,min_free_kbytes参数:
用来指定系统应保留的最小空闲内存量;
应用场景:适当增加min_free_kbytes,可以帮助解决内存压力、I/O 阻塞和网络性能等;
如果内存使用量接近或超过物理内存容量,可能导致系统开始使用交换空间(swap),进而影响系统性能。
资源 | 类型 | 性能指标 |
存储设备I/O | 使用率 | 设备I/O时间百分比 (命令:iostat -d -x 2) |
存储设备I/O | 饱和度 | 等待队列或延迟(命令:iostat -d -x 2) |
存储设备I/O | 错误数 | I/O错误数(命令:iostat -d -x 2) |
iostat -d -x 2 查看所有磁盘的IO情况
lsblk/fdisk -l 查看存储设备pvs/lvs
fio性能测试工具,性能指标:IOPS、MBPS、latency
资源 | 类型 | 性能指标 |
文件系统 | 使用率 | 已用容量百分比 |
文件系统 | 饱和度 | 已用容量百分比 |
文件系统 | 错误数 | 文件读写错误 |
/usr/sbin/filetop-bpfcc -C;
查看每个文件的读写情况,系统的I/O状态
/usr/sbin/opensnoop-bpfcc;
显示正在被打开的文件
lsof -p pid;
查看进程打开的文件;
资源 | 类型 | 性能指标 |
网络 | 使用率 | 带宽使用率 |
网络 | 饱和度 | 重传报文数 |
网络 | 错误数 | 网卡手法错误数、丢包数 |
其它command:
sar -n DEV 1 5
查看网卡的吞吐,网卡状态
可参考:(网络)协议栈分析,连接/协议栈状态:,使用ethtool、netstat
网络抓包及分析
网络抓包及分析:tcmdump -w保存文件为.pcap后缀文件,交给wireshark File菜单栏的 Open,做分析/过滤/展示等动作
Wireshark界面:
过滤栏:对抓包数据进行过滤(协议过滤,输入:tcp/http/icmp)
数据列表区:每一行是一个数据包,包含编号、时间戳、源地址、目标地址、协议、长度、数据包信息
数据详情区:显示选中数据包中的详细数据信息
数据字节区:
数据详情区:(离不开 TCP/IP 七层/五层模型)
物理层 -> 链路层 -> 网络层 -> 传输层 ->应用层(会话层&表示层&应用层)
通过wireshark对TCP连接(三次握手的过程),可以分析出问题,常见的有:
1.客户端发送 SYN 报文后,服务端没有任何回复或者回复了 RST 报文;原因有可能是:服务器的端口没被监听、或被防火墙拦截
2.TCP重传,会被标记为TCP retransmission;如果重传都在同一个目标地址,一般是应用自己处理的性能低造成的(重传太多会影响性能,严重的话会导致TCP中断)
分析:a.首先查看是否网络负载过高(通过 wireshark 提供的 IO Graph 查看)
b.查看重传的端口,确定是哪个应用
(通过 Statistics 菜单的 Conversation 选项,打开网络会话窗口,在 IPv4 选项卡下,勾选 Limit to display filter 复选框,就可以看到所有发生重传的会话,可以进一步确认;在网络会话窗口中,点击 TCP 选项卡,同样勾选 Limit to display filter 复选框,可以查看具体的重传端口,确认是哪个应用,从而定位具体的问题)
c.问题能否复现,是否周期性,确定是该应用的问题后,应用的操作是否会触发重传?
wireshark抓包分析出应用程序存在性能问题(重传问题),一般如何解决?
优化方案:
1.应用优化:优化应用程序的代码和数据库查询,减少处理时间
除了带啊优化,其它优化 方案:
2.优化TCP窗口大小:调整TCP窗口大小以适应网络带宽和延迟3.检查/调整MTU:确保MTU(成最大传输单元)设置合理,表面分片和重传
归纳总结:
i.问题是否与某台主机、某个特定的 TCP 连接或者某种具体行为相关联。
ii.逐一排查:链路是否负载过高,链路是否存在丢包,服务器或者客户端主机是否存在性能问题,应用程序是否存在性能问题。
iii.最终问题:是否是网络抖动引起的。
快速排查故障的方法
1.CPU性能分析
使用top/atop/vmstat、pidstat、strace/perf、ftrace/bcc查看CPU的性能指标后,再结合进程和CPU的工作原理,定位CPU性能瓶颈的来源。
如果查看到CPU使用过高的情况,首先查看CPU使用率过高的进程,分析进程的行为,然后使用strace分析进程的系统调用情况或者使用perf工具查看该进程使用CPU最多的函数,必要时使用动态追踪的方法,观察当前进程的执行过程,从而确定瓶颈的来源
CPU使用率过高 -> 确定CPU使用率过高的进程 -> strace分析进程的系统调用或perf查看该进程使用CPU最多的函数 -> 动态追踪分析进程的执行过程 -> 定位瓶颈来源
如果是系统调用的问题,优化方案有:
a.减少频繁的打开/关闭文件
b.优化网络请求
c.代码优化:算法优化、并行处理
d.内核调优:sysctl -w vm.swappiness=10,控制系统将内存中的数据交换(swap)到磁盘的倾向。其值在 0 到 100 之间,值越小,表示系统更倾向于使用物理内存,尽量避免使用交换空间。
e.硬件升级
如果是某个函数占用CPU多,优化方法:
定位到函数后,通过详细分析代码,有可能是复杂的算法、频繁的循环、资源争用等问题,导致CPU占用过多a.优化代码逻辑(减少不必要的计算、优化数据结构)
b.并行化处理
c.缓存优化、内存优化
d.硬件升级等
2.内存性能分析
使用free、vmstat查看性能指标,找出占用内存最多的几个进程,根据这些进程的内存占用历史,分析是否存在内存泄露问题,继续分析该进程的内存空间和内存分配,最后弄清楚为什么会占用大量内存,必要时使用动态追踪方法分析
3.磁盘和文件系统分析
使用iostat命令初步分析磁盘IO的瓶颈(比如:IO使用率过高,响应时间过长,或者等待队列突然加大),再通过pidstat、vmstat确定IO来源并找出IO最多的进程,再使用strace、lsof、perf分析IO行为,再结合应用程序的原理,找出大量IO的原因
4.网络分析
网络分析,使用USE方法(Utilization、Saturation、Errors)+ TCP/IP模型来分析;
物理层:检查硬件设备是否存在故障
链路层:检查吞吐量(PPS每秒包数、BPS每秒自己数)、丢包数、错误数、软中断和网络功能分析
网络层:丢包、拆包、TTL、路由、分片叠加网络分析
传输层:从TCP/UDP的协议出发,分析连接数、吞吐量、延迟、重传数
应用层:分析源代码的多进程、数据结构、循环嵌套、处理长整数数据类型、系统调用、中断等是否太过于频繁
内核参数调优
内核参数:Linux内核有许多可调整的参数,可以影响系统的性能和行为。例如,TCP/IP参数、内存管理参数、文件系统缓存等。适当的内核参数调整可以改善系统的性能和资源利用率。
通过优化内核参数,可以根据具体的应用场景和需求,提高系统的性能和稳定性。这些调整通常涉及文件系统、进程管理、网络配置、内存管理等多个方面。在实施这些优化时,建议逐步进行测试和监控,以确保调整带来的效果符合预期
优化内核参数--最大打开文件数&最大进程数(fs.file-max)
适用场景:高并发应用、大型数据处理系统、容器化环境
# 查看当前最大打开文件数 cat /proc/sys/fs/file-max
# 临时调整最大打开文件数 echo 1000000 > /proc/sys/fs/file-max
# 永久调整最大打开文件数,编辑 /etc/sysctl.conf 文件,添加以下行: fs.file-max = 1000000
# 使配置生效 sysctl -p
优化内核参数--网络连接跟踪表大小(net.netfilter.nf_conntrack_max
)
网络连接跟踪表大小 (
net.netfilter.nf_conntrack_max
)场景:高并发网络服务器、负载均衡器、防火墙
# 查看当前连接跟踪表大小 cat /proc/sys/net/netfilter/nf_conntrack_max
# 临时调整连接跟踪表大小 echo 262144 > /proc/sys/net/netfilter/nf_conntrack_max
# 永久调整,编辑 /etc/sysctl.conf 文件,添加以下行: net.netfilter.nf_conntrack_max = 262144
# 使配置生效 sysctl -p
优化内核参数--TCP 最大缓冲区大小 (net.ipv4.tcp_rmem
, net.ipv4.tcp_wmem
)
TCP 最大缓冲区大小 (
net.ipv4.tcp_rmem
,net.ipv4.tcp_wmem
)
场景:高带宽网络应用、数据中心传输、视频流服务器
# 永久调整,编辑 /etc/sysctl.conf 文件,添加以下行:
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 16384 16777216
优化内核参数--共享内存大小 (kernel.shmmax
)
共享内存大小 (
kernel.shmmax
)场景:数据库服务器、大型科学计算、内存密集型应用
# 临时调整共享内存大小 echo 68719476736 > /proc/sys/kernel/shmmax # 设置为 64GB
优化内核参数--网络接口队列长度 (net.core.netdev_max_backlog
)
网络接口队列长度 (
net.core.netdev_max_backlog
)场景:高吞吐量网络服务器、网络流量负载均衡器、视频流服务器
优化内核参数--系统内存回收频率 (vm.swappiness
)
系统内存回收频率 (
vm.swappiness
)场景:内存受限系统、性能优化
# 临时调整 swappiness 值 echo 10 > /proc/sys/vm/swappiness
# 值越低,系统越倾向于使用物理内存,而不是交换分区
# 永久调整,编辑 /etc/sysctl.conf 文件,添加以下行: vm.swappiness = 10
优化内核参数--系统内存回收频率 (vm.dirty_ratio
, vm.dirty_background_ratio
)
文件系统写回时间 (
vm.dirty_ratio
,vm.dirty_background_ratio
)
场景:高 I/O 吞吐量服务器、数据库服务器、文件服务器
安全加固
1.关闭不常用的服务
2.清除不必要的系统账户
3.隐藏linux版本号
4.系统关闭ping
5.升级openSSH、openSSL至安全版本
6.禁止root账号远程登录、修改ssh端口号
7.锁定关键文件系统并禁止修改
chattr +i /etc/passwd
chattr +i /etc/inittab
chattr +i /etc/group
chattr +i /etc/shadow
chattr +i /var/log/message
然后再给chattr命令其别名
8.history加入时间和操作者 IP的属性
网络层面的安全加固:
9.避免放大攻击
10.处理无源路由的包
11.开启SYN flood洪水攻击保护
12.启用timewait快速回收
13.修改防火墙表大小
14.限制系统可打开的端口范围
15.开启内核sync cookie保护
等等