Linux面试最高频的5个基本问题( 二 )

查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep “cpu cores” | uniq查看逻辑CPU的个数
cat /proc/cpuinfo| grep “processor”| wc -lCPU负载很高 , 利用率却很低 , 说明处于等待状态的任务很多 , 负载越高 , 代表可能很多僵死的进程 。 通常这种情况是IO密集型的任务 , 大量任务在请求相同的IO , 导致任务队列堆积 。
生产环境造成CPU利用率低负载高的具体场景常见的有如下几种 。
进程在cpu上面运行需要访问磁盘文件 , 这个时候cpu会向内核发起调用文件的请求 , 让内核去磁盘取文件 , 这个时候cpu会切换到其他进程或者空闲 , 这个任务就会转换为不可中断睡眠状态 。 当这种读写请求过多就会导致不可中断睡眠状态的进程过多 , 从而导致负载高 , cpu低的情况 。
我们都知道MySQL的数据是存储在硬盘中 , 如果需要进行sql查询 , 需要先把数据从磁盘加载到内存中 。 当在数据特别大的时候 , 如果执行的sql语句没有索引 , 就会造成扫描表的行数过大导致I/O阻塞 , 或者是语句中存在死锁 , 也会造成I/O阻塞 , 从而导致不可中断睡眠进程过多 , 导致负载过大 。
同样 , 可以先通过top命令观察 , 假设发现现在确实是高负载低使用率 。
Linux面试最高频的5个基本问题
本文插图
然后 , 再通过命令ps -aux查看是否存在状态为D的进程 , 这个状态指的就是不可中断的睡眠状态的进程 。 处于这个状态的进程无法终止 , 也无法自行退出 , 只能通过恢复其依赖的资源或者重启系统来解决 。 以下图中没有D状态的进程 。
Linux面试最高频的5个基本问题
本文插图
Linux上进程的五种状态

  • R (TASK_RUNNING):可执行状态 , 只有在该状态的进程才可能在CPU上运行 。 而同一时刻可能有多个进程处于可执行状态 。
  • S (TASK_INTERRUPTIBLE):可中断的睡眠状态 , 处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量) , 而被挂起 。
  • D (TASK_UNINTERRUPTIBLE):不可中断的睡眠状态 , 进程处于睡眠状态 , 但是此刻进程是不可中断的 。 TASK_UNINTERRUPTIBLE状态存在的意义就在于 , 内核的某些处理流程是不能被打断的 。
  • T (TASK_STOPPED or TASK_TRACED):暂停状态或跟踪状态 。
  • Z (TASK_DEAD - EXIT_ZOMBIE):退出状态 , 进程成为僵尸进程 。 进程已终止 , 但进程描述还在 , 直到父进程调用wait4系统调用后释放 。
这表示CPU的任务并不多 , 但是任务执行的时间很长 , 大概率就是你写的代码本身有问题 , 通常是计算密集型任务 , 生成了大量耗时短的计算任务 。