CPU 占用忽高忽低?一文搞懂 Linux 实时 / 非实时进程调度底层逻辑
Linux 进程调度与运维实操指南副标题附带源码编译、私有 YUM 仓库、at/cron 定时任务全套运维实操前言线上服务器经常出现 CPU 波动、关键业务响应卡顿、定时任务抢占资源等问题根源大多是不了解 Linux 内核进程调度机制。本文一次性覆盖运维四大核心板块软件源码编译、内网自建 YUM 私有仓库、一次性 / 周期性计划任务、实时与非实时调度完整原理一、Linux 软件包管理源码编译安装1.1 源码安装原理Linux 软件主流安装方式分为 rpm 离线包、yum 在线包、源码编译。yum 安装版本、模块、安装路径全部固定无法自定义源码编译是下载软件原生 C 代码本地 gcc 编译生成二进制程序优势明显自由自定义安装目录文件统一规整按需开启 / 关闭软件内置功能模块可使用官方最新版本不受系统仓库限制兼容全系列 CentOS/RHEL 发行版。源码编译固定三步流程./configure检测系统编译依赖库自动生成 Makefile 编译脚本依赖缺失会直接报错终止make调用 gcc 编译源代码生成二进制程序仅编译不写入系统目录make install将编译完成的程序、配置、静态资源复制到--prefix指定路径。1.2 源码编译 Nginx 逐行拆解实操1.2.1 安装编译依赖yuminstallgccmakepcre-devel zlib-develgcc makeC 语言编译器、编译工具集源码编译必备pcre-devel正则库支撑 Nginx rewrite URL 重写功能zlib-devel压缩库实现网页 gzip 压缩降低带宽消耗缺少任意依赖./configure配置阶段直接失败。1.2.2 下载并解压官方源码包wgethttps://nginx.org/download/nginx-1.24.0.tar.gztar-xfnginx-1.24.0.tar.gzwget网络文件下载工具tar -xf自动识别压缩格式解压无需额外-z参数。1.2.3 configure 指定安装根目录cdnginx-1.24.0/ ./configure--prefix/usr/local/nginx--prefix定义软件总目录安装完成后生成 4 个核心文件夹confnginx 主配置、虚拟主机配置存放目录html网站默认静态页面目录logs访问日志、错误日志存放目录sbinnginx 二进制启动程序。1.2.4 编译 安装合并执行makemakeinstall逻辑前一条命令执行成功才会执行后一条编译报错则不会执行安装步骤。1.2.5 配置全局 PATH 环境变量# 临时生效当前终端关闭后失效exportPATH$PATH:/usr/local/nginx/sbin/# 永久写入用户环境变量新开终端自动加载echoexport PATH$PATH:/usr/local/nginx/sbin/~/.bashrcPATH 是系统命令检索目录列表未配置时只能输入完整路径/usr/local/nginx/sbin/nginx启动配置后直接输入nginx即可调用程序。1.2.6 Nginx 启停、重载命令详解nginx启动服务生成 master 主进程、多个 worker 工作进程nginx -s quit优雅停止不再接收新连接等待现有客户端请求处理完成后关闭生产环境优先使用nginx -s stop强制立刻杀死进程未完成请求直接中断线上业务不推荐nginx -s reload平滑重载配置master 进程 PID 不变仅重启 worker 进程加载新配置业务无中断。验证服务正常运行curl-shttp://localhost|grepThank输出pemThank you for using nginx./em/p代表 Nginx 启动成功。1.2.7 制作 systemd 托管服务文件源码安装的 Nginx 无系统自带 service 单元无法使用systemctl快捷管理手动创建服务文件托管cp/usr/lib/systemd/system/sshd.service /etc/systemd/system/nginx.servicevim/etc/systemd/system/nginx.service写入配置[Unit] DescriptionNginx server daemon [Service] Typeforking ExecStart/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload/usr/local/nginx/sbin/nginx -s reload ExecStop/usr/local/nginx/sbin/nginx -s quit [Install] WantedBymulti-user.target重载 systemd 并设置开机自启systemctl daemon-reload systemctlenablenginx--nowdaemon-reload让 systemd 识别新增的自定义服务文件enable --now设置开机自启同时立刻启动服务。1.3 源码安装 cmatrix黑客帝国代码雨工具1.3.1 依赖安装yum-yinstallgccmakeautoconf ncurses-develautoconf自动生成 configure 配置脚本ncurses-devel终端字符图形库实现彩色滚动字符效果。1.3.2 完整编译流程和 Nginx 编译逻辑完全一致解压→进入源码目录→configure 指定安装路径→make make install。wgethttp://192.168.50.200/class/course-materials/softwares/stage01/cmatrix-1.2.tar.gztar-xfcmatrix-1.2.tar.gzcdcmatrix-1.2/ ./configure--prefix/usr/local/cmatrixmakemakeinstallexportPATH$PATH:/usr/local/cmatrix/bin1.3.3 使用参数与运行快捷键运行示例cmatrix-b-u3-Cred-b加粗字符-u 3画面刷新延迟取值 0~10数字越小滚动速度越快-C red设置字体颜色支持 green/blue/yellow/white/cyan 等多种色系。运行中无需重启程序即可实时调整样式数字 0-9实时修改滚动速度Shift1~Shift8一键切换红 / 绿 / 黄 / 蓝 / 洋红 / 青 / 白 / 黑色字体。二、自建 HTTP 私有 YUM 仓库完整知识点2.1 适用场景企业内网服务器无法连通外网公共 yum 源无法在线安装软件。搭建一台仓库服务器统一存放 rpm 包所有内网机器通过 HTTP 协议拉取软件实现离线批量部署、标准化装机。2.2 搭建四大核心步骤批量下载所需软件 全部依赖 rpm 包使用 createrepo 工具生成仓库索引 repodataNginx 开启目录浏览功能对外提供 HTTP 访问客户端编写 repo 配置文件指向私有仓库地址。2.3 服务端操作逐行解析2.3.1 批量下载 rpm 包mkdirrpmscdrpms yuminstall--downloadonly--downloaddir.vimopen-vm-tools vsftpd lrzsz nginx httpd mariadb-server--downloadonly仅下载软件包不执行安装操作--downloaddir .所有 rpm 包保存至当前目录自动递归下载全部依赖包。将软件包移动至 Nginx 网页发布目录mkdir/usr/local/nginx/html/toolsmvrpms /usr/local/nginx/html/tools/Packages2.3.2 createrepo 创建仓库元数据yum 安装软件时依赖 repodata 索引文件夹索引记录软件名称、版本、依赖关系无索引文件客户端无法识别 rpm 包yuminstall-ycreaterepo createrepo /usr/local/nginx/html/tools/重点每次新增、删除、更新 rpm 包后必须重新执行 createrepo 更新索引否则客户端识别不到新包。2.3.3 Nginx 开启目录浏览Nginx 默认禁止展示目录文件列表修改 nginx.conf 的 http 全局块开启浏览http { autoindex on; }重载 Nginx 配置生效systemctl reload nginx访问http://服务器IP/tools/即可查看全部 rpm 包列表。2.4 客户端配置私有仓库2.4.1 备份原有官方源避免源冲突mkdir/etc/yum.repos.d/oldmv/etc/yum.repos.d/*.repo /etc/yum.repos.d/old2.4.2 新建 repo 源配置文件catEOF/etc/yum.repos.d/tools.repo[tools] namecentos7 tools from server.laoma.cloud baseurlhttp://server.laoma.cloud/tools/ enabled1 gpgcheck0 EOF字段详细拆解[tools]仓库唯一 IDyum 识别标识name仓库自定义展示名称baseurl仓库 HTTP 访问地址enabled1启用该仓库0 代表禁用gpgcheck0关闭 rpm 数字签名校验内网私有源无需校验。配置完成后验证软件安装yuminstall-yhttpd2.5 reposync 本地离线同步仓库如需单机完全离线使用可把远程私有仓库所有包同步至本地reposync--repoidtools createrepo toolsreposync拉取远程仓库全部 rpm 包至本地目录createrepo本地重新生成索引本机可完全离线安装软件。三、Linux 计划任务一次性 at 周期性 cron3.1 两类任务核心区分at 一次性任务仅执行一次执行完成自动销毁依赖后台atd守护进程crond 周期性任务按分 / 时 / 日 / 月 / 周循环重复执行依赖crond守护进程。3.2 at 一次性计划任务全知识点3.2.1 atd 服务基础所有 at 任务都依靠 atd 后台程序执行服务未启动定时任务不会运行systemctl status atd输出active (running)代表服务正常运行。3.2.2 三种创建任务方式交互式手动输入at now 5 minutes atechohello world/tmp/hello.log# 按下CtrlD结束输入终端出现EOT标识脚本重定向读取任务at now 5 minutesmyscript.sh-f 参数指定脚本文件at now 100 minutes-fmyscript.sh3.2.3 支持的时间格式相对时间now 5 minutes、now 2 hours固定时刻15:43、teatime (16 点)、noon (12 点)完整日期5 pm august 3。3.2.4 任务队列 -q 参数队列标识为小写字母 a~z字母越靠后任务优先级越高a (默认最低) b ... z (最高)# 创建b高优先级队列任务at-qb now 5 minutesmyscript.sh# 仅查看b队列所有任务atq-qb3.2.5 任务管理命令atq / at -l查看全部 at 任务输出任务 ID、执行时间、队列、创建用户at -c 任务ID查看任务完整脚本与内置环境变量atrm / at -d 任务ID删除指定一次性任务任务执行完毕后会自动从队列清除。3.2.6 at 黑白名单权限控制匹配优先级严格从上至下存在/etc/at.allow白名单仅文件内写入的用户可使用 at其余全部禁止无 allow 文件读取/etc/at.deny黑名单黑名单内用户禁止使用 atallow、deny 都不存在系统所有用户默认可使用 atdeny 文件为空无用户限制全部允许。3.3 crond 周期性定时任务深度讲解3.3.1 crond 与 crontab 核心关系crond系统常驻后台守护进程每分钟扫描一次所有定时规则匹配时间自动执行无 crond 进程所有定时任务不会运行crontab管理用户定时规则的操作命令实现定时任务增删改查。3.3.2 crontab 核心操作命令# 查看当前登录用户定时任务[lizihancentos7 ~]$crontab-l# 无任务输出no crontab for lizihan# 编辑当前用户定时切换vim编辑器[lizihancentos7 ~]$exportEDITORvim[lizihancentos7 ~]$crontab-e# 清空当前用户全部定时谨慎使用不可恢复[lizihancentos7 ~]$crontab-r# root管理员操作其他用户定时[rootcentos7 ~]# crontab -u lizihan -e[rootcentos7 ~]# crontab -u lizihan -l[rootcentos7 ~]# crontab -u lizihan -r# 从本地文件批量导入定时规则[lizihancentos7 ~]$crontabmycron3.3.3 定时标准语法分 时 日 月 周 执行命令 * * * * * /usr/bin/date /tmp/date.log取值范围分0~59时0~23日1~31月1~12支持 Jan/Feb 英文简写周0~60/7 代表周日1 周一至 6 周六通用通配符规则*匹配每一个单位x-y连续区间10-31 代表每月 10 号到月底x,y离散多值14,15 代表 14、15 两个整点*/n间隔执行*/2 代表每 2 分钟 / 每 2 小时。示例完整拆解* 14,15 10-31 */2 1-5 /bin/bash /usr/local/bin/myscript.sh每分钟、14/15 点、当月 10~31 号、奇数月 (1/3/5/7/9/11)、周一至周五执行脚本。3.3.4 crontab 高频踩坑环境问题cron 执行脚本不会加载用户~/.bashrc内置环境变量极少脚本、内部命令必须写绝对路径脚本标准输出、错误输出默认以邮件发送给 lizihan长期堆积大量垃圾邮件两种屏蔽邮件写法# 保留执行日志屏蔽报错邮件* * * * * /usr/local/bin/myjob/var/log/cron.log2/dev/null# 完全屏蔽所有输出无日志无邮件* * * * * /usr/local/bin/myjob/dev/null21# 一键清空lizihan用户全部邮件/var/spool/mail/lizihan3.3.5 系统级定时区分用户私有定时用户定时crontab -e写入文件存放/var/spool/cron/lizihan仅 lizihan 用户权限执行/etc/crontab系统全局定时格式多一个执行用户字段* * * * * root command/etc/cron.d/自定义定时目录软件自带定时存放目录系统更新不会覆盖/etc/anacrontab补执行定时服务器关机错过的日 / 周 / 月任务开机自动补跑配套固定执行目录/etc/cron.daily 每日任务/etc/cron.weekly 每周任务/etc/cron.monthly 每月任务四、Linux 进程调度实时调度器 非实时调度器底层精讲4.1 调度器核心作用服务器进程数量远大于 CPU 物理核心内核调度器负责分配 CPU 时间片决定进程执行优先级这也是线上 CPU 占用忽高忽低、业务卡顿的核心根源。调度器分为两大类非实时调度器系统默认、实时调度器。4.2 非实时调度器 SCHED_OTHERCFS 完全公平调度4.2.1 适用范围系统 99% 普通进程Nginx、MySQL、ssh、crontab 脚本、终端交互程序核心目标是CPU 资源公平分配。4.2.2 nice 优先级机制排错核心nice 值取值范围-20 ~ 19-20最高优先级分得更多 CPU 时间19最低优先级分得最少 CPU 时间权限限制普通用户 lizihan仅能设置正数 nice只能降低进程优先级无法设置负数root 用户可任意修改 - 20~19 全部数值继承规则子进程默认继承父进程 nice 值终端 shell 默认 nice0。4.2.3 修改 nice 两条核心命令nice启动进程时直接指定优先级# 默认nice10降低进程优先级nicemd5sum /dev/zero# 普通用户调高nice2优先级变低nice-n2md5sum /dev/zero# root调低nice-5提升进程优先级nice-n-5md5sum /dev/zerorenice修改已经运行的进程优先级renice-n2PID号普通用户只能增大 nice 数值root 无限制。4.2.4 top/ps 快速区分实时 / 非实时进程top 命令 PR 字段判断规则非实时进程PR 为 0~39 正数实时进程PR 显示负数快速判断口诀PR≥0 → 非实时ps 查看完整调度信息ps-opid,nice,pr,cls,commandNI进程 nice 值PR内核静态优先级CLSTSSCHED_OTHER 非实时调度标识。4.2.5 调度核心特性动态自动调整长期占用 CPU 的进程自动降权频繁休眠的 IO 进程自动升权温和抢占机制仅当前进程时间片耗尽才切换任务高负载下延迟不可控容易出现 CPU 波动硬性规则所有实时进程优先级高于最高优先级普通进程nice-20。4.3 实时调度器 SCHED_FIFO / SCHED_RR4.3.1 适用场景硬实时低延迟业务工业 PLC 控制、机器人、音视频解码、高频交易要求任务就绪后立刻抢占 CPU杜绝 CPU 波动卡顿。4.3.2 实时优先级规则优先级范围1~99数字越大优先级越高静态固定内核不会自动调整人为设置永久生效强抢占机制高优实时进程就绪立刻打断所有低优进程低优实时进程 全部普通进程。4.3.3 两种实时调度策略区别SCHED_FIFO先进先出无时间片限制进程拿到 CPU 持续运行直到主动 sleep、退出、被更高优先级进程抢占同优先级任务按启动顺序依次执行。SCHED_RR轮询实时自带 100ms 固定时间片同优先级多个进程轮流使用 CPU高优先级任务依旧可随时抢占。4.3.4 chrt 命令管理实时调度仅 root 可用# 查看所有调度策略优先级区间chrt-m# RR策略启动进程优先级5chrt-r5md5sum /dev/zero# 修改运行中PID为FIFO策略优先级10chrt-f--pid1056225# 恢复为普通非实时调度chrt-o--pid056225ps 查看标识CLSFF (FIFO) / RR (RR)RTPRIO 列显示 1~99 实时优先级。4.3.5 内核防卡死保护参数防止死循环实时进程独占 100% CPU 导致系统卡死、ssh 无法连接kernel.sched_rt_period_us调度周期 1 秒1000000 微秒kernel.sched_rt_runtime_us1 秒内实时进程最多占用 0.95 秒 CPU剩余 0.05 秒强制分给普通进程保障 ssh、系统基础服务可用。4.4 实时调度器 vs 非实时调度器对比表对比维度非实时调度 SCHED_OTHER实时调度 SCHED_FIFO/SCHED_RR优先级体系nice -20~19内核动态自动调整1~99 静态固定数字越大优先级越高抢占能力温和抢占等待时间片结束才切换强抢占高优任务就绪立刻插队操作权限所有普通用户均可设置调整仅 root 权限允许配置top PR 标识0~39 正数负数设计目标CPU 资源平均分配兼顾所有进程确定性低延迟优先保障核心业务稳定典型业务Web 服务、数据库、定时脚本、日常程序工业控制、音视频、高频交易、低延迟业务优先级层级全部低于任意实时进程全部高于所有普通进程全文核心总结源码编译三步./configure → make → make install可自定义安装路径配合 systemd 实现服务托管私有 YUM 仓库三大核心rpm 软件包 createrepo 索引 Nginx 目录浏览适配内网离线环境at 一次性任务依赖 atd 守护进程、a-z 优先级队列、allow/deny 黑白名单管控用户使用权限crontab 周期性任务严格遵循分时日月周五语法脚本必须使用绝对路径输出重定向屏蔽垃圾邮件区分用户私有定时与 anacron 补执行系统定时进程调度排错关键普通进程通过 nice/renice 调整权重低延迟业务使用 chrt 配置实时策略最低优先级实时进程性能调度权限高于最高优先级普通进程也是线上 CPU 忽高忽低的核心诱因。