Linux进程优先级与调度器:从nice到CFS的完整解析

发布时间:2026/10/10 12:45:28
Linux进程优先级与调度器:从nice到CFS的完整解析 聊到Linux进程优先级、进程切换和调度我猜不少人是带着问号点进来的这几个概念背过不少八股可真到线上系统卡死、某个进程CPU跑满、renice怎么改都不见效的时候却依然不知道从哪下手。这篇文章就是围绕这套机制展开的讲清楚调度器、优先级、进程切换三者如何咬合在一起适合刚接触Linux内核的后端开发者、系统运维以及对性能优化感兴趣的朋友。读完你至少能回答三个问题为什么进程优先级不是简单一个数字、上下文切换到底贵在哪里、以及实操时哪些命令能安全地控制进程的CPU使用。1. 设计思路拆解优先级、切换与调度到底在讲什么很多人把“进程优先级”“进程切换”“调度”当成三个孤立的考点去背这其实是个误区。它们本质上是同一个闭环里的三个环节调度器是决策者负责回答“下一个该谁用CPU”进程优先级是决策依据告诉调度器哪些进程更重要进程切换是执行动作把CPU从上一个进程交到下一个进程手里。把这三件事拆开就永远看不明白调度器的工作方式。用一个食堂排队的例子来理解。食堂窗口只有一个打饭的人却有一大堆这就是CPU和进程的关系。调度器相当于“食堂阿姨”她决定下一个轮到谁优先级是“排队资格”VIP窗口的人永远比普通窗口先打饭进程切换则是“上一个人端着餐盘走开、下一个人走到窗口”的这个交接动作。只要有一个环节理解不对整个模型就会出偏差。从知识结构上看我建议你按这样的顺序往下读先搞清楚优先级体系中各套数字的换算逻辑再看进程状态和切换时机之后进入调度器核心算法的设计意图最后落到命令行实操和故障排查。这个顺序本质上是一条“是什么、为什么、怎么用、怎么排错”的完整路径正好把零散的资料串成一张能直接用的知识网。1.1 三个概念如何形成完整闭环一个进程正在CPU上跑运行过程中必然会被时钟中断打断。中断处理流程里内核会检查一个标志位有没有更值得运行的进程被唤醒如果有就标记TIF_NEED_RESCHED等到中断返回或系统调用返回时进入调度主路径__schedule()。调度器根据当前各调度类、各进程的优先级和运行时间数据选出下一个进程然后调用context_switch()完成两套上下文之间的切换。新进程继续在CPU上运行直到下一次中断或主动让出。这就是一次完整的调度周期。注意这里有个关键点调度不是“随时可以发生”的。内核为了保证数据结构一致性只允许在安全点执行调度比如系统调用返回用户态之前、中断返回之前、或者进程在内核态主动睡眠的时候。这就是“抢占点”的概念。搞懂了这个安全点机制你才能理解为什么一个SCHED_FIFO的实时进程死循环会让整个系统失去响应——它一直在用户态跑根本没有进入调度路径的机会。1.2 为什么这块老知识仍然值得狠狠挖一个常见的面试题是“Linux调度器如何选择下一个进程”但实际工作中这项知识照样有用甚至在出故障时能救命。我见过不少线上事故一个后台批处理任务把nginx的CPU抢光防火墙、监控全部超时也有人不小心把采集进程设成实时优先级结果机器除了SSH什么都干不了。这些故障的根因都在优先级体系和调度器设计里藏着。从性能调优的角度看理解进程优先级意味着你能够在不改代码的情况下通过调整nice、chrt、taskset等工具让关键业务进程在资源竞争激烈时保住CPU份额。往深了说这还关系到高并发服务为什么普遍使用epoll而非为每个连接开一个线程——因为线程频繁切换的成本远超你的直觉。今天的Linux内核已经演进到了CFS甚至更新的调度器实现但“优先级表达权重、公平分配CPU、廉价但非免费的进程切换”这三大命题一直没变过。2. 核心机制一进程优先级是怎么设计的Linux里的优先级不是一个简单的数字它分了好几套体系。最容易被搞混的是nice值、实时优先级和内核内部使用的优先级prio。这三套数字既要区分对待又会通过固定的换算关系联动。只有先把这几套数字在脑子里分开后面看top的PR列、ps的NI列才不会有歧义。2.1 nice值与权重别被“越小越高”绕晕nice值范围是-20到19默认0。它的语义可以理解为“对别人的友好程度”数值越大代表我对其他进程越谦让自己越不抢CPU数值越小代表我越贪婪优先级越高。所以nice值越小进程的调度优先级反而越高。这里很多初学者会绕晕其实是把“nice”翻译成“友好”再推理一遍方向很容易反。更关键的在于nice值不是直接对应“多给多少时间片”而是映射到“权重”。内核维护了一张静态表sched_prio_to_weightnice值每差一级权重约差1.25倍。每相差5个nice等级权重约差4倍。举个例子nice0的进程权重是1024nice5的进程权重大约是335nice-5的进程权重大约是3355。这就意味着一个nice-5的进程在CFS调度器下获得的CPU时间大体是一个nice5进程的10倍。可别小看这张权重表它就是“优先级高低如何转化为实际CPU份额”的答案。这张映射表是非线性的原因也很实际Linux希望为不同nice值对应的CPU占比保持合理梯度。如果线性递增高优先级进程会过分挤压低优先级进程导致低优先级任务长期饥饿。通过查表而不是公式计算则是因为调度器在热点路径上需要极快的运算查一张预先算好的表比做浮点除法快得多。2.2 实时优先级另一个维度的“高优先”实时优先级是另一套体系范围是0到99数字越大优先级越高和nice恰好相反。实时进程运行的调度类是SCHED_FIFO、SCHED_RR或SCHED_DEADLINE。只要实时队列里存在可运行进程普通进程CFS调度类就没有机会上CPU哪怕你把普通进程的nice设成-20也无济于事。这一点是我最想提醒的很多人以为把进程nice调得很低就能抢占一切资源但实际上实时优先级才是绝对的王者。nice-20的普通进程也只是在CFS内部权重最高跟实时进程根本不是一个赛道。实时优先级是给那些对延迟有硬性要求的任务准备的比如工业控制、音频处理线程、某些网络收包线程。普通业务服务里乱用实时优先级轻则让其他进程卡顿重则让整个系统失去响应。内核其实也留了后手默认配置下实时进程在一个周期内的总运行时间会受到限制这正是我后面要讲的/proc/sys/kernel/sched_rt_runtime_us。2.3 优先级体系全貌对照把几套数字放在一起看会更清楚。内核早期调度器中其实还有一个统一的概念叫做运行队列里的“优先级数组下标”0到99划分给实时进程数字越大优先级越高100到139划分给普通进程对应nice值从-20到19数字越小优先级越高。这套线性设计到CFS时代虽然不再直接用数组下标选出进程但优先级对权重的影响依然保留了下来。普通进程的nice值在top里通常显示为NI列而PR列是内核视角的优先级默认情况下约等于20 NI。实时进程的PR列则直接显示为rt。很多人死记硬背“top中PR越小优先级越高”结果看到rt这种字符就懵了。其实只要记住三套数字的换算逻辑这些屏幕上的字符就能一眼看懂。3. 核心机制二进程切换的真相进程切换不是简单地把寄存器和栈换一下那么简单。它牵涉到页表、TLB、缓存、调度统计等多个子系统是Linux内核里开销最被低估的操作之一。面试如果能把切换的具体流程和开销讲清楚基本能甩开一大半只背概念的候选人。3.1 进程状态与调度时机首先得看进程状态因为调度器只会调度处于TASK_RUNNING状态的进程。进程状态储存在task_struct的state字段里常见状态包括TASK_RUNNINGR可运行或正在运行、TASK_INTERRUPTIBLES可中断睡眠、TASK_UNINTERRUPTIBLED不可中断睡眠、TASK_STOPPEDT、TASK_TRACEDt、EXIT_ZOMBIEZ以及EXIT_DEADX。这里的坑点主要在D状态。处在TASK_UNINTERRUPTIBLE状态的进程通常是在等待某种IO比如磁盘IO、NFS访问它不响应信号连kill -9都杀不掉。如果一个进程长期处于D状态系统负载load average会被拉高但这跟调度器关系不大更多是底层IO子系统出了问题。这条知识点在故障排查时非常重要我后面的实操部分会专门展开。调度时机大致分两类。一类是主动调度比如进程调用sleep()、阻塞在read()、等待锁释放说白了是进程自己“用完了时间主动让出CPU”。另一类是被动抢占比如时钟中断发现当前进程已经运行了足够长时间或者一个更高优先级的进程被唤醒于是设置TIF_NEED_RESCHED标志等到安全点真正执行调度。注意被动抢占又分用户态抢占和内核态抢占内核态抢占要求当前进程的preempt_count为0即没有持有锁等禁止抢占的状态。3.2 一次上下文切换到底换掉了什么真正执行切换的函数是context_switch()它做两件大事。第一件是switch_mm_irqs_off()切换进程地址空间包括页表指针和进程的mm结构这一步会导致原来那些属于旧进程的TLB项失效新进程访问内存时多数要重新查页表。第二件是switch_to()负责将CPU寄存器、内核栈指针、指令指针等硬件上下文从旧进程保存到task_struct再加载新进程的上下文。switch_to()这段汇编逻辑非常讲究。经典的实现里它是通过宏把寄存器压栈然后直接跳转到下一个进程的内核栈上继续执行。用行话说就是“进程A的最后一个动作是加载进程B的上下文”。这就像接力赛跑到终点时接棒选手已经冲了出去前后两棒在交棒的一瞬间是协同的。个人在写运维脚本或分析崩溃栈时如果看到内核栈从__schedule一路调用到switch_to就知道此刻正处在上下文切换现场。页表切换对性能的影响尤其容易被低估。如果是同一个进程内的线程切换由于共享地址空间页表不用换TLB也基本不用刷新开销小得多。这也是为什么多线程比多进程更适合高并发的原因——除了共享内存带来的便利光上下文切换成本都省了一大截。3.3 切换开销为什么不能小觑用数据说话一次普通系统调用大约需要0.5微秒到1微秒而一次完整的进程上下文切换往往需要3微秒到10微秒量级高了一个数量级。如果涉及不同进程、不同地址空间切换TLB失效带来的“冷启动”影响还会持续更久甚至影响后续几十微秒内的访存性能。高频切换不仅损失CPU时间还会把整个系统的有效吞吐拉下来。最简单的类比就是厨师做菜如果每做一道菜都要重新刷锅、重新备料、重新起火他大部分时间根本没花在做菜上。这也是为什么nginx、Redis这类高性能服务普遍采用事件驱动模型尽量避免阻塞IO——不是为了炫技而是因为它们承受不起“每个连接一个进程频繁上下文切换”带来的开销。所以看线程池配置时不要只盯着“临界区多小、锁多快”线程数一上去切换开销自然会成为瓶颈。4. 核心机制三调度器如何做决策调度器是Linux内核中最核心的子系统之一。从2.6早期的O(1)调度器到后来的CFS完全公平调度器再到如今混合了EAS、EEVDF等优化的新内核设计目标始终没变在“公平”和“效率”之间找到平衡。理解这些设计目标的演变过程比死记任何一个版本的算法细节都更有价值。4.1 从O(1)到CFS为什么要引入“公平”概念2.4内核时代调度器是O(n)复杂度每次选下一个进程都要遍历整个就绪队列扫描所有进程的优先级和运行时间。进程一多调度本身就变成性能瓶颈。2.6早期引入O(1)调度器用两个优先级数组活动队列和过期队列加上位图在常数时间内就能找到最高优先级的可运行进程。进程运行完时间片后进入过期队列活动队列空了就把两个队列互换指针使普通进程不会被饿死。但O(1)调度器的问题也逐渐暴露它需要通过启发式判断来区分交互式进程和批处理进程判断逻辑复杂且容易出错对多核场景、动态负载的适应性也不好。于是CFS在2.6.23版本接替了它。CFS抛弃了“时间片优先级数组”的模型转而模拟理想的多任务CPU假设所有可运行进程应该平分处理器时间每个进程记录一个虚拟运行时间vruntime谁的vruntime最小谁就最“亏欠”CPU于是下一个就运行谁。4.2 CFS的vruntime与红黑树算法精髓CFS用一个红黑树来组织所有可运行进程键值就是vruntime。调度时直接取树的最左节点也就是vruntime最小的进程。进程运行过程中vruntime会随着实际运行时间增加。这里有个关键公式vruntime的增加量不是简单的实际运行时间而是按进程权重缩放后的“虚拟时间”。权重越高的进程vruntime增长越慢于是它在红黑树里“插队”的能力越强被选中的频率也就越高。这就是nice值影响力的真正落点。新进程刚创建时它的vruntime会被初始化在min_vruntime附近而不是从0开始否则一个刚启动的进程会把红黑树最左端抢走老进程反而长期得不到调度。睡眠时间很长的进程被唤醒时也一样CFS会把它的vruntime调回合理范围防止它因为睡眠期间没有增长而一醒来就霸占CPU——这也是为什么“IO密集型进程”在CFS下不会被惩罚得太惨。理解这一点你才算真正看懂了“为什么进程被唤醒后不一定立刻能跑”。CFS还涉及两个调度参数调度周期sched_latency_ns和最小调度粒度sched_min_granularity_ns。默认情况下一个调度周期约为若干毫秒周期内可运行进程越多每个进程分到的时间越短但是不能低于最小粒度否则切换开销占比太高。所以当系统进程数暴涨时调度周期会被拉长以保证每个进程至少运行一个最小粒度的时长。4.3 调度类与实时策略为什么实时进程能“锁死”系统现代内核中调度器由多个调度类组成按优先级从高到低排列stop_sched_class、dl_sched_class、rt_sched_class、fair_sched_class、idle_sched_class。调度时内核从高到低逐类检查一旦某个调度类有可运行进程就优先从中选择。stop类用于CPU热插拔、停机等特殊场景dl类用于SCHED_DEADLINErt类则服务于实时策略进程fair类就是前面说的CFSidle类是最后兜底的。这解释了为什么一个SCHED_FIFO的实时进程进入死循环系统会几乎失去响应它的rt调度类优先级永远在fair之上CFS里的普通进程根本没有机会上CPU。内核其实提供了一个限制手段/proc/sys/kernel/sched_rt_period_us和/proc/sys/kernel/sched_rt_runtime_us默认大约在1秒周期内限制实时进程最多跑0.95秒把剩下的0.05秒硬性留给普通进程。但如果你把实时优先级推到99仍然有很大概率导致系统卡死因为普通进程虽然能抢到一点点时间往往也只是够处理一下中断交互体验依然极差。实时调度的具体策略有三个SCHED_FIFO先进先出同等优先级的实时进程不轮转运行中的进程除非主动让出或遇到更高优先级否则会一直运行SCHED_RR则对同等优先级进程进行时间片轮转SCHED_DEADLINE基于最早截止时间优先。生产环境如果需要实时能力一般建议用SCHED_FIFO但必须分层设计优先级绝不能所有线程都堆到99。5. 实操过程命令行里的优先级控制理论知识聊完该上手了。在实际的Linux系统里控制优先级最常用的工具是nice、renice、chrt和taskset。它们分别对应了不同维度的控制nice/renice管CFS普通进程的权重chrt管实时调度类和实时优先级taskset管CPU亲和性。下面每一步都是我实测过的可以直接照抄。5.1 nice/renice调整普通进程优先级启动一个程序时用nice指定nice值。比如我想让一个压缩任务不对在线服务造成太大影响nice -n 10 tar czf backup.tar.gz /var/data如果进程已经启动用renice动态调整renice -n 5 -p 12345执行后可以通过ps确认ps -o pid,ni,pri,comm -p 12345输出类似PID NI PRI COMMAND 12345 5 25 python3注意NI列显示5PRI显示25正好是20 5的组合。如果想给负值就是提高优先级sudo renice -n -10 -p 12345需要root权限或至少CAP_SYS_NICE能力普通用户最多只能往“更友好”的方向调不能反方向抢占CPU。容器场景下更要注意Docker默认会丢弃部分CAP_SYS_NICE能力所以你可能会遇到“renice报权限不足”的尴尬这属于容器权限模型的问题不是命令用错了。实际排障时top是更直观的工具直接看NI列和PR列。我见过不少人分不清PR和NI其实记住前面说的换算关系这问题就解决了普通进程的PR大致等于20 NINI越小PR越小优先级越高实时进程的PR直接显示为rt。5.2 chrt设置实时优先级时的注意事项查看一个进程的实时调度策略和优先级chrt -p 12345输出长这样pid 12345s current scheduling policy: SCHED_OTHER pid 12345s current scheduling priority: 0把进程设为SCHED_FIFO并且优先级50sudo chrt -f 50 -p 12345再次查看pid 12345s current scheduling policy: SCHED_FIFO pid 12345s current scheduling priority: 50操作前一定要想清楚后果。我的建议是除非你非常确定这个进程不会卡死、不会长时间忙等、不会持有锁不释放否则不要用SCHED_FIFO。即使要用也优先考虑SCHED_RR因为同等优先级下至少还有时间片轮转兜底。另外实时进程在运行过程中如果触发了缺页异常、内存分配、锁竞争等内核路径不一定能满足严格的实时延迟要求因此做嵌入式或音视频这类硬实时项目时多半还要配合内存锁定mlockall、内核预分配等手段避免运行时陷入不可预测的内核操作。5.3 taskset绑定CPU核心与调度器协同绑定CPU核心用的taskset实际调整的是CPU亲和性。查看某个进程允许在哪些核上运行taskset -pc 12345把进程绑定到0到3号核taskset -pc 0-3 12345启动时就绑定taskset -c 2-3 ./app绑定核心的好处是减少处理器间迁移、避免缓存反复失效坏处是如果绑定到的那几个核本身负载很高进程也无法利用其他空闲核心。所以taskset经常和psr列配合排查ps -eLo pid,psr,comm可以告诉你每个线程当前跑在哪个核上。现代CFS调度器本身带了负载均衡机制会在唤醒新进程和周期性调度时尝试把进程搬到更空闲的核心上但迁移有成本所以除非有明确的NUMA或缓存亲和性需求不建议对所有配置一刀切绑定。5.4 权限与限制如何防止普通用户乱设优先级普通用户能把nice调低到什么程度、能不能用chrt这些都可以配置。/etc/security/limits.conf是经典入口例如限制用户ops只能使用50以下的实时优先级ops soft rtprio 50 ops hard rtprio 50修改后重新登录生效用ulimit -r查看ulimit -r如果你不想让任何普通用户使用实时调度把上限设为0就可以了。另一方面cgroup的cpu.weight也能控制不同控制组之间的CPU份额这是更现代也更适合做资源隔离的方式。比如在容器编排时给数据库单独一个cgroup并提高它的cpu.weight比逐进程调nice更可控也更符合多租户场景。6. 常见问题与排查技巧实录这块是我最想分享的因为网上能找到的命令用法很多但故障现场的排查思路很少有人系统写下来。以下每个场景都是我实际遇到过、或同事踩过坑之后复盘出来的。6.1 为什么renice到-20还是卡我先问一句你真确认瓶颈在CPU吗很多“调了优先级但没效果”的情况根因根本不是CPU调度。排查顺序应该是这样的先用top看整体CPU使用率再用pidstat -d看进程的磁盘读写用iostat看系统IO等待用pidstat -u看单进程CPU占比。如果卡顿来自IO等待或网络等待那你把nice调到-20也没用——它只影响CPU调度不影响磁盘队列、网络栈或内存带宽。另一种情况是跟它抢CPU的对手本身也是个高优先级进程。你把自己调到-10别人也是-10甚至还有实时进程在后面压着那自然没有明显改善。最后别忘了看一眼top的PR和NI列是否按预期变化。我曾经见过一个案例配置脚本里先renice紧接着服务进程又自行重置了nice值看着配置生效了实际完全没影响。6.2 实时进程死循环导致系统假死怎么办这种情况很危险一个SCHED_FIFO或SCHED_RR进程进入死循环它占据CPU不退出而更高优先级的调度类只有stop和dl平时根本够不着它。普通进程只能靠内核保留的那一点实时配额偶尔跑一下SSH都很难连上几乎处于“功能性假死”状态。预防远比事后处理重要。第一生产环境不要给任何业务进程设SCHED_FIFO 99保持优先级分层主业务线程50到70关键中断线程80到90普通线程40以内。第二检查/proc/sys/kernel/sched_rt_period_us和/proc/sys/kernel/sched_rt_runtime_us默认值会限制实时进程占用但你不一定所有内核版本都保证如此最好显式确认。第三做好寿终正寝的方案比如让实时任务循环中主动让出CPU、用看门狗线程消费“心跳”超时后通过特定机制杀掉异常任务。如果真到了必须现场自救的份上可以试试配置了Magic SysRq的键盘组合键恢复控制但网络环境里往往来不及反应真不行就重启把损失控制在可接受范围。6.3 load average飙升但CPU占用不高系统负载高但CPU很闲十有八九是D状态进程在作祟。load average统计的是“正在运行”和“等待运行”的进程数量但内核统计时也会把不可中断睡眠的进程算进去于是磁盘卡死、NFS挂起、IO控制器异常都会让进程卡在D状态把负载推高却看不到高CPU占用。排查时先列出D状态进程ps -eo state,pid,cmd | awk $1D再配合/proc/PID/stack或/proc/PID/wchan看它到底阻塞在哪个内核函数上。这类问题跟调度器关系不大但面试和实际运维中经常混在一起考所以放在这里提醒看到load高先别急着怀疑调度先看状态分布。6.4 单核打满其余空闲负载均衡问题多核机器上最气人的现象是16个核一个核100%其他15个核闲着进程还没绑定亲和性。CFS理论上会自动做负载均衡但它不是实时的。唤醒进程时会尝试选择最空闲的核周期性调度也会做balance但频率和策略都要平衡“均衡收益”和“迁移成本”。如果进程长时间运行且负载没有触发迁移条件就可能出现局部热点。先用ps -eLo psr,pid,comm | grep 进程名看所有线程分布在哪个核上。如果发现确实挤在一个核可以用taskset手动散开或让进程自己启动多线程。对于多实例业务进程最稳妥的办法是启动时用numactl --interleaveall或taskset -c分配到不同CPU组。记住调度器的均衡是“尽力而为”不是“强制平均”系统层面的二次干预仍然很有必要。7. 面试怎么问、怎么答这块专门写给准备面试或者想检验自己掌握程度的朋友。Linux调度相关的高频题其实不多但每道题都可以挖得很深。我总结几个经典问法和回答要点。7.1 经典问题清单CFS如何选择下一个运行的进程答看红黑树最左节点也就是vruntime最小的进程。vruntime按权重缩放权重越大增长越慢被选中概率越高。为什么CFS用红黑树而不是简单队列答需要支持O(log n)地按vruntime增删进程同时要允许新进程以合理位置插入队列无法同时满足动态排序和高性能要求。一个nice值为负的进程为什么不一定立刻抢到CPU答nice只影响CFS内部权重不影响实时调度类而且即使权重更高也只是“虚拟时间增长慢”如果它的vruntime已经很大照样要等红黑树里更靠左的进程先跑。上下文切换会换掉哪些东西答寄存器、内核栈指针、页表及相关架构状态如调试寄存器、浮点状态。线程间切换不换页表进程间切换换页表因此线程切换通常比进程切换便宜。如何提升某个进程的实时性答用chrt设置SCHED_FIFO或SCHED_RR并配合CPU绑定、内存锁、中断隔离等手段。只调nice达不到硬实时效果。什么是抢占点答内核检查TIF_NEED_RESCHED并允许调度的安全点包括系统调用/中断返回路径通常不在持有锁时主动抢占。7.2 易混淆点对照我把这几年面试和带新人过程中反复出现的混淆点整理成一张表照着背至少能少犯一半错误概念常见误解正确理解nice值越大优先级越高-20到19越小越抢CPU实时优先级和nice同一套逻辑0到99越大越高且始终高于普通进程top的PR列就是nice值普通进程约等于20NI实时进程显示rt进程切换只是切换栈和PC进程间切换还涉及页表、TLB、缓存失效SCHED_FIFO时间片轮转同优先级不轮转除非主动让出或遇到更高优先级负载高一定是CPU跑满D状态进程阻塞在IO也会拉高load最后分享一个我踩过的坑收尾就不整什么总结体系了说点实打实的经历。我刚转做运维那阵为了确保一个数据采集进程不被影响脑子一热给它设成了SCHED_FIFO 98。结果某天它进入死循环整台机器除了工具恢复几乎没响应最后只能硬重启。从那以后我对实时优先级的态度很简单能不用就不用要用就分层用而且一定先检查/proc/sys/kernel/sched_rt_runtime_us和cgroup限制把总预算焊死。如果你也经常排查这类问题我建议把下面这条命令存下来。它能快速告诉你当前系统里到底哪些进程在用实时调度优先级是多少ps -eo pid,rtprio,cls,comm --sort-rtprio | head -20rtprio列不是-、cls列是FF或RR的就是实时队列里的家伙。遇到莫名其妙的系统卡顿第一步先跑这条命令往往比翻半天日志更管用。调度器这东西抽象起来很复杂但落到命令行和故障现场其实也就是几个命令和几次复盘的事。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询