Linux 负载探索

发布时间 - 2025-07-22 00:00:00    点击率:

在理解linux的平均负载之前,需要先了解linux的进程状态。

Linux进程状态可以通过man ps命令查看。

PROCESS STATE CODES    Here are the different values that the s, stat and state output     specifiers (header "STAT" or "S") will display to describe the    state of a process:       D    uninterruptible sleep (usually IO)       R    running or runnable (on run queue)       S    interruptible sleep (waiting for an event to complete)       T    stopped by job control signal       t    stopped by debugger during the tracing       W    paging (not valid since the 2.6.xx kernel)       X    dead (should never be seen)       Z    defunct ("zombie") process, terminated but not reaped by its parent

与信号相关的不同进程状态

任何Linux进程的起点是它们被创建的时刻。例如,父进程可以通过fork()系统调用启动子进程。一旦启动,进程将进入运行或可运行状态。在进程运行时,它可能会进入需要等待特定资源或信号的代码路径。在等待资源的同时,这个进程将自愿放弃CPU周期,进入两种睡眠状态之一。

此外,我们可以暂停运行中的进程并将其置于停止状态。通常,这是通过向进程发送SIGSTOP信号来实现的。这种状态下的进程将继续存在,直到它被杀死或通过SIGCONT信号恢复。最后,当进程终止并进入僵尸状态时,该进程将完成其生命周期,直到其父进程将其从进程表中清除。

运行或可运行状态(R):当新进程启动时,它将处于运行或可运行状态。在运行状态下,进程占用CPU内核来执行其代码和逻辑。然而,线程调度算法可能会迫使运行中的进程放弃其执行权。这是为了确保每个进程都能公平分享CPU资源。在这种情况下,进程将被放置在运行队列中,其状态现在是可运行状态,等待轮到它执行。

虽然运行状态和可运行状态是不同的,但它们被组合成一个由R字符表示的单一状态。

睡眠状态:可中断(S)和不可中断(D):在进程执行期间,它可能会遇到需要请求外部资源的代码部分。主要是对这些资源的请求是基于IO的,例如从磁盘读取文件或提出网络请求。由于没有资源,这个进程无法进行,它将停滞不前,什么都不做。在此类事件中,他们应该放弃CPU周期,放弃其他准备运行的任务,从而进入睡眠状态。

有两种不同的睡眠状态:不可中断睡眠状态(D)和可中断睡眠状态(S)。不可中断的睡眠状态只会等待资源可用,然后才能进入可运行状态,并且不会对任何信号做出反应。另一方面,可中断的睡眠状态将对信号和资源可用性做出反应。

停止状态(T):从运行或可运行状态,我们可以使用SIGSTOPSIGTSTP信号将进程置于停止状态(T)。这两个信号的区别在于,我们发送的SIGSTOP是编程的,例如运行kill -STOP {pid}。此外,进程不能忽略此信号,并将进入停止状态。另一方面,我们使用键盘CTRL + Z发送SIGTSTP信号。与SIGSTOP不同,该进程可以选择忽略此信号,并在收到SIGTSTP后继续执行。

在这种状态下,我们可以通过发送SIGCONT信号将进程恢复到运行或可运行状态。

僵尸状态(Z):当进程完成执行或终止时,它将向父进程发送SIGCHLD信号并进入僵尸状态。僵尸进程,也称为已停用进程,将保持此状态,直到父进程将其从进程表中清除。要从进程表中清除终止的子进程,父进程必须使用wait()waitpid()系统调用读取子进程的退出值。

Linux负载平均值查看方法

# 方法一:uptime
$ uptime
18:05:12 up 518 days,  5:22,  1 user,  load average: 0.00, 0.01, 0.05

方法二:top

top - 18:05:24 up 518 days, 5:22, 1 user, load average: 0.00, 0.01, 0.05

方法三:cat /proc/loadavg

$ cat /proc/loadavg 0.00 0.01 0.05 3/192 30524

平均负载的3个数值分别代表1分钟、5分钟、15分钟系统的平均负载情况。通过这三个数值的变化,我们可以知道系统最近一段时间的压力变化趋势。

Unix中负载的名称解释:

系统负载/CPU负载 - 是衡量Linux系统中CPU利用率过高或不足的指标;CPU正在执行或处于等待状态的进程数量。平均负载——是在给定的1、5和15分钟时间内计算的平均系统负载。Linux源码解释:

单位时间内,系统中处于可运行状态和不可中断状态的平均进程数。

在Linux中,从技术上讲,负载平均值是其(内核)执行队列中标记为运行或不间断的进程的运行平均值。

CPU平均负载与CPU使用率的区别:

平均负载:指单位时间内,处于可运行状态和不可中断的进程数。

CPU使用率:正在使用CPU的进程。

可以从定义看到两者的不同,CPU平均负载不仅包括了正在使用CPU的进程,还包括等待CPU和等待I/O的进程。而CPU使用率指的是正在使用CPU的进程。

可以用常见两种场景来解释:

CPU密集型的进程:因为进程大量的使用CPU,所以平均负载会比较高,CPU使用率也会跟着很高。

I/O密集型进程:这个会出现很多进程在等待I/O的操作,会存在很多进程处于不可中断状态,所以负载会变高,但是CPU使用率不一定会很高。

负载平均值简单理解:

一个具有多个CPU或多核CPU的系统。在这样的系统上,负载平均数的工作方式略有不同。例如,如果您在单个CPU系统上的平均负载为2,这意味着您的系统被100%超载——在整个期间,一个进程正在使用CPU,而另一个进程正在等待。在一个有两个CPU的系统上,这将是完全的使用——两个不同的进程一直在使用两个不同的CPU。在一个有四个CPU的系统上,这将是一半的使用——两个进程使用两个CPU,而两个CPU闲置。

要了解负载平均数,需要知道系统有多少个CPU。平均负载6.03表示单个CPU的系统被严重超载,但在一台有8个CPU的计算机上可以。

这里引用下一篇简单理解的博文信息:

交通类比

这基本上就是CPU负载。“汽车”是使用一段CPU时间(“过桥”)或排队使用CPU的进程。Unix将此称为运行队列长度:当前正在运行的进程数加上等待(排队)运行的进程数之和。

负载平均值的排查:

系统平均负载指是处于可运行状态和不可中断状态的进程的平均数量。

即单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和CPU使用率并没有直接关系。

可运行状态的进程,包括正在使用CPU的进程,和正在等待CPU的进程。对应于ps命令输出的STAT列中状态为R的进程。状态R:running or runnable (on run queue)

不可中断状态的进程,表示正在等待其它系统资源的进程,例如等待磁盘I/O。对应于ps命令输出的STAT列中状态为D的进程。状态D:uninterruptible sleep (usually IO)。

不可中断状态实际上是系统对进程和硬件设备的一种保护机制。比如,当一个进程向磁盘读写数据时,为了保证数据的一致性,在得到磁盘回复前,它是不能被其他进程或者中断打断的。

由于在Linux操作系统里,Load是一个定义及其含混的指标,排查loadavg高就是一个很复杂的过程。其基本思路就是,根据引起Load变化的根源是R状态任务增多,还是D状态任务增多。

推荐大家可以阅读下面文章:

Solving the Mystery

https://www./link/90256d5c6119498ae5e11944224ee417

理解Linux系统负荷

https://www./link/526b2103e4390c4996db8c15102957fe

可以查看原文:

https://www./link/5aaa384f657cd101b3a1752998130672


# linux  # 操作系统  # qq  # ai  # 区别  # linux操作系统  # igs  # html  # Token  # 线程  # 事件  # 算法  # https  # unix  # 运行状态  # 时间内  # 或可  # 我们可以  # 是一个  # 这是  # 两种  # 将其  # 很高  # 可以通过 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用Telescope进行调试?(安装和使用教程)  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  Laravel distinct去重查询_Laravel Eloquent去重方法  Laravel如何实现API版本控制_Laravel版本化API设计方案  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  Laravel如何配置和使用缓存?(Redis代码示例)  JavaScript数据类型有哪些_如何准确判断一个变量的类型  linux写shell需要注意的问题(必看)  phpredis提高消息队列的实时性方法(推荐)  如何在建站宝盒中设置产品搜索功能?  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  如何在阿里云虚拟主机上快速搭建个人网站?  长沙企业网站制作哪家好,长沙水业集团官方网站?  怎么用AI帮你设计一套个性化的手机App图标?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  如何用PHP工具快速搭建高效网站?  JS实现鼠标移上去显示图片或微信二维码  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  如何快速生成可下载的建站源码工具?  Python函数文档自动校验_规范解析【教程】  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  如何用已有域名快速搭建网站?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  javascript基本数据类型及类型检测常用方法小结  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  Linux系统命令中screen命令详解  深圳网站制作培训,深圳哪些招聘网站比较好?  Java解压缩zip - 解压缩多个文件或文件夹实例  如何获取上海专业网站定制建站电话?  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  如何快速建站并高效导出源代码?  Linux后台任务运行方法_nohup与&使用技巧【技巧】  北京的网站制作公司有哪些,哪个视频网站最好?  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  Android中AutoCompleteTextView自动提示  如何在万网ECS上快速搭建专属网站?  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  制作公司内部网站有哪些,内网如何建网站?  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  详解Android图表 MPAndroidChart折线图  如何在万网利用已有域名快速建站?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  Java类加载基本过程详细介绍  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转