Linux系统调优

目录

性能调优五大维度-思维导图

整体排查

1.top/atop/htop名命令:查看进程、CPU、内存的情况

2.dstat 2:查看CPU、磁盘IO、网络IO、换页、中断、切换,系统I/O状态;

3.iostat -d -x 2 查看所有磁盘的IO情况,系统I/O状态;

4.iotop查看IO靠前的进程,系统的I/O状态

5.perf top查看占用CPU最多的函数,CPU使用情况

6.sar -n DEV 1 5查看网卡的吞吐,网卡状态;

7./usr/sbin/filetop-bpfcc -C 查看每个文件的读写情况,系统的I/O状态;

8.mpstat -P ALL 1 单核CPU是否被打爆;

9.ps aux --sort=-%cpu 按CPU使用率排序,找出CPU消耗最多进程;

10.ps命令统计前20内存占用;

进程分析,进程占用的资源

协议栈分析,连接/协议栈状态(网络)

分析方法论

USE方法分析 CPU

USE方法分析 Memory

USE方法分析Disk-存储设备

USE方法分析文件系统

USE方法分析网络

网络抓包及分析

快速排查故障的方法

1.CPU性能分析

2.内存性能分析

3.磁盘和文件系统分析

4.网络分析

内核参数调优

优化内核参数--最大打开文件数&最大进程数(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
  1. 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% - 被虚拟化超管程序“偷走”的时间百分比。
  2. read writ: 磁盘 I/O

    • read: 316M - 从磁盘读取的数据量。
    • writ: 709M - 写入磁盘的数据量。
  3. recv send: 网络 I/O

    • recv: 0 - 接收的数据量(网络接口)。
    • send: 0 - 发送的数据量(网络接口)。
  4. in out: 系统中断和上下文切换

    • in (Interrupts): 0 - 每秒发生的中断数。
    • out (Context Switches): 0 - 每秒发生的上下文切换数。
  5. 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 内核中的作用是执行内存数据的复制操作

其它用法:
perf record -ag -- sleep 15;perf report 
进行性能数据采集和报告生成的操作,查看CPU事件占比,调用栈,CPU使用情况;

  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_64cpu_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: 网络接口名称,例如 ens160loens192
  • 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: 类型和文件路径,读取或写入操作的文件类型和文件路径

其它用法:
/usr/sbin/opensnoop-bpfcc
显示正在被打开的文件,系统的I/O状态;

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 操作、任务切换等信息。

  1. pidstat 2 -p pid;查看可疑进程CPU使用率变化情况;

  2. pidstat -w -p pid 2;查看可疑进程的上下文切换情况;

  3. 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、内存、存储设备、文件系统、网络五大维度,细节如下:

USE方法分析 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最多的函数


 

USE方法分析 Memory

资源类型性能指标
内存使用率已用内存百分比/已用交换区百分比(命令: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),进而影响系统性能。

USE方法分析Disk-存储设备

资源类型性能指标
存储设备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

USE方法分析文件系统

资源类型性能指标
文件系统使用率已用容量百分比
文件系统饱和度已用容量百分比
文件系统错误数文件读写错误

 /usr/sbin/filetop-bpfcc -C;查看每个文件的读写情况,系统的I/O状态

/usr/sbin/opensnoop-bpfcc;显示正在被打开的文件

lsof -p pid;查看进程打开的文件;

USE方法分析网络

资源类型性能指标
网络使用率带宽使用率
网络饱和度重传报文数
网络错误数网卡手法错误数、丢包数

 其它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保护

等等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值