1.ps命令的常见用法

  • ps aux

    image-20250428212923424

  • ps -eo: 自定义输出格式

    image-20250428213239620

  • 使用ps命令查看某个进程的详细信息:

    • 使用PID: ps -p <PID> -o pid,ppid,cmd,%cpu,%mem

    • 通过进程名查找: ps aux | grep <进程名>

      image-20250428213615139

  • 杀死一个进程:

    • kill -9 + <Pid>: 强制杀死一个进程
    • pkill <进程名>

2.CPU负载高,怎么排查?

  • 排查高负载是否是高 CPU 利用率引起的:
    • topps aux: 找到高CPU利用率的进程的Pid。
    • 检查:检查该进程是否处于死循环、是否存在计算密集型任务等。
  • 如果是低 CPU 利用率,而出现高负载: 可能是由于IO等待所造成的

    • 通过top命令查看%wa: %wa表示CPU因为IO操作而空闲的时间占比
  • 频繁的上下文切换(进程/线程过多): 内核态的时间长,用户态时间短

    • 通过top命令查看%sys(内核态 CPU 时间,应该会升高),%user(用户态 CPU 时间,降低)

    注:上下文切换:当 CPU 从一个进程(或线程)切换到另一个进程时,需要保存当前任务的上下文(寄存器、内存页表等)并加载新任务的上下文

3.对于IO等待造成高负载的问题,应该如何改善?

  • 减少不必要的I/O操作
  • 异步I/O:如果可能,采用异步I/O操作代替同步I/O,让程序在等待I/O完成的同时能够继续执行其他任务。
  • 批量处理I/O请求:尽量合并多个小的I/O请求为一个大的请求,这样可以减少I/O调用的开销。
    • 对于磁盘I/O来说,磁头移动到特定位置并开始读取数据的过程称为“寻道”。这个过程相对较慢。如果以小块的形式请求数据,会导致更多的寻道操作,从而降低整体效率。
    • 在网络通信中,每个单独的数据包都会增加一定的延迟(如传输延迟、排队延迟等)。将多个小的数据包组合成一个大的数据包发送,不仅可以减少总的网络延迟,还能更有效地利用带宽。
  • 使用缓存:对于频繁访问的数据,可以使用缓存机制来减少直接从磁盘或数据库读取数据的需求。
  • 更快的存储设备:考虑使用SSD代替HDD,因为SSD提供更快的数据读写速度。

4.什么样的场景会造成CPU的利用率高?怎么解决?

常见高 CPU 利用率场景

  • 计算密集型任务%user 高(用户态 CPU 占用高)-》多线程/多进程
  • 死循环、未优化的递归操作 -》进行算法优化
  • 中断风暴: %soft 高(如恶意攻击 SYN Flood) -》 中断延迟处理机制(调整中断优先级,确保关键中断能够得到及时处理,将非紧急的、耗时的处理任务转移到低优先级的任务或线程中处理)
    • 频繁的任务切换
    • 抢占正常进程执行:中断具有较高的优先级,它们可以打断正在运行的进程。如果中断频繁发生,正常的用户进程和服务将得不到足够的CPU时间,从而影响系统性能

5.软中断的作用?软中断的类型?

​ 与硬中断不同,软中断不会直接打断正在运行的代码,而是在内核控制下,在适当的时候被调度执行。软中断主要用于提高系统的响应速度和效率,并且允许延迟处理某些任务,从而避免长时间阻塞在中断处理程序中。

它介于硬件中断(快速但不可并行)和线程(灵活但调度延迟高)之间。

类型:

  • net_txnet_rx:分别表示网络传输(发送)和接收过程中的软中断数量。在网络数据包的发送和接收过程中,为了保证高效的数据处理,会使用软中断来完成部分工作。
  • block:与块设备I/O相关的软中断数量。当有磁盘读写请求时,可能会产生这类软中断。
  • timer:定时器相关的软中断数量。

  • hi:表示由硬中断触发的软中断处理次数。硬中断发生后,可能会触发相应的软中断进行后续处理。

  • hrtimer:高精度定时器相关的软中断数量。

软中断性能指标的作用:

诊断性能瓶颈:通过监控这些软中断的数量或消耗的时间,可以帮助识别系统中的性能瓶颈所在。例如,如果发现大量的net_rx软中断,可能意味着网络接收端存在压力,可能是由于网络流量过大或网卡处理能力不足等原因造成的。-》1.绑定中断到多核,避免所有 NET_RX 中断集中在单个CPU。2.限流

6.netstat的常见用法

  • 查看所有活动连接: netstat -a
  • 仅显示TCP连接: netstat -at
  • 仅显示UDP连接: netstat -au
  • 查看特定PID的所有TCP连接: netstat -anp | grep <PID> | grep 'tcp'

7.TCP三次握手发送方发送SYN,一直收不到ACK,会怎么样?

  • SYN重传

    • 首次发送SYN:客户端发送SYN报文,进入SYN_SENT状态。
    • 重传规则
      • 初始超时时间(RTO):通常为1秒
      • 指数退避:每次重传的超时时间翻倍(如1s, 2s, 4s, 8s…)。(防止过多的重传请求导致网络拥塞)
      • 重传次数:默认通常为6次
  • 最终放弃连接

    • 达到最大重传次数后,客户端内核会:
      • 关闭连接
      • 通知应用程序

8.Linux能建立的最大的TCP连接数

理论最大连接数:

  • 源端口号范围 限制

  • 全局文件描述符限制

    1
    cat /proc/sys/fs/file-max  # 内核最大文件句柄数(默认约10%内存)
  • 由内存决定: 每个 TCP 连接占用约 3~10KB 内存

9.网络编程中read函数的返回值

1
ssize_t read(int fd, void *buf, size_t count);

返回值:

  • 正数:如果返回值是正数,那么它表示实际从套接字读取到的字节数。
  • 0:如果返回值为 0,这意味着连接已经被对端正常关闭
  • -1:如果返回值为 -1,则表示发生了错误。具体的错误信息可以通过全局变量 errno 获得。
    • EAGAIN :在非阻塞模式下,当前没有数据可读。

10.CPU处理指令的步骤

  • 取指:

    • 程序计数器(PC) 提供下一条要执行指令的地址。
    • CPU通过地址总线访问内存,根据PC提供的地址读取指令,并将其加载到指令寄存器(IR)中。
  • 译码:

    • 在此阶段,CPU分析指令的内容,确定其类型(例如加法、减法、乘法等),以及所需的操作数位置。
  • 执行

    • ALU(算术逻辑单元)进行数学运算、逻辑比较,或者更新寄存器的内容
  • 写回:

    • 计算得到的结果会被写回到指定的目标寄存器或内存位置。
  • 更新PC:

    • 更新程序计数器(PC)以指向下一个待执行的指令。