影响进程调度 Linux 进程调度现代计算机系统使用多核、多线程 CPU可以同时执行多个指令线程。最大型的高性能超级计算机可能配备数百或数千个 CPU每个 CPU 有数百个处理核心和线程结构能够并行处理数百万条指令线程。虽然单个用户运行许多应用可能会使典型的桌面系统或个人工作站充满 CPU 活动但适当大小和配置的工作站能够匹配用户的预期工作负载。不过典型的企业或互联网服务器每秒要处理数百或数千个用户和应用请求这会导致 CPU 饱和。CPU 负载下的所有系统都会遇到一些情况需要处理的进程线程数超过立即调度线程可用的系统 CPU 处理单元。Linux 和其他操作系统使用称为时间片或多任务的技术来进行进程管理。操作系统进程调度程序在每个可用 CPU 核心上的进程线程之间快速切换。此行为给人同时运行许多进程的印象。进程优先级进程优先级设置每个进程的重要性。Linux 实施调度策略定义进程的组织规则和优先级以获得 CPU 处理时间。可能使用不同的 Linux 调度策略处理交互式应用请求、非交互式批处理应用或实时应用要求。实时调度策略仍然使用进程优先级和队列。但是当前的非实时普通调度策略使用完全公平调度程序 (CFS)它将等待 CPU 时间的进程组织到二叉搜索树中。此进程优先级将 SCHED_NORMAL 或 SCHED_OTHER 策略用作默认调度策略。在 SCHED_NORMAL 策略下运行的进程被分配一个静态实时优先级 0以确保所有系统实时进程的优先级高于普通进程。但是在为 CPU 调度组织普通进程线程时不包括此静态优先级值。取而代之CFS 调度算法将普通进程线程安排到加权二叉树中第一个项目之前花费的 CPU 时间最少最后一个项目的累计 CPU 时间最多。Nice 值二进制树的顺序还受到用户可修改的、各个进程的 nice 值影响其范围从 -20优先级增加到 19优先级降低不等默认值为 0。进程从其父进程继承其初始 nice 值。所有用户都可以调整 nice 值以降低优先级但只有 root 可以提高它的优先级。较高的 nice 值表示进程优先级低于默认值或使进程对其他进程较为友好。较低的 nice 值表示进程优先级高于默认值或使进程对其他进程较为不友好。增大 nice 值会降低线程的位置而减小 nice 值会提高线程的位置。Nice 值修改权限特权用户可以减小进程的 nice 值以降低进程的 nice 值。然后进程会被重复放置在二进制树中的较高位置因此被调度的频率也更高。在饱和的系统上其他进程可用的总 CPU 时间会减少。非特权用户只能增大自己进程的 nice 值使自己的进程更加友好从而降低其在二进制树中的位置。非特权用户无法通过降低其进程的 nice 值来提高其重要性也无法为其他用户的进程调整 nice 值。查看 Nice 值nice 值映射到优先级值两个值均可在进程列表命令中查看。在 top 命令中nice 值 -20 映射到优先级 0。在 top 命令中nice 值 19 映射到优先级 39。在之前的图中nice 值与 top 命令使用的优先级值一致。top 命令在 PR 列中显示进程优先级并在 NI 列中显示 nice 值。top 优先级编号方案将实时进程优先级显示为负数这是内部优先级算法的传统做法。以下输出是 top 命令中的摘要和部分进程列表Tasks: 192 total, 1 running, 191 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 1.6 sy, 0.0 ni, 96.9 id, 0.0 wa, 0.0 hi, 1.6 si, 0.0 st MiB Mem : 5668.6 total, 4655.6 free, 470.1 used, 542.9 buff/cache MiB Swap: 0.0 total, 0.0 free, 0.0 used. 4942.6 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND 1 root 20 0 172180 16232 10328 S 0.0 0.3 0:01.49 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp使用默认格式选项时ps 命令显示进程 nice 值。以下 ps 命令列出所有进程包括其进程 ID、进程名称、nice 值和调度类。这些进程按照 nice 值降序排列。在 CLS 调度类列中TS 代表时间共享这是普通调度策略的另一个名称包括 SCHED_NORMAL。其他 CLS 值如代表先进先出的 FF 和代表循环的 RR表示实时进程。实时进程不分配 nice 值如 NI 列中的短划线 (-) 所示。[userhost ~]$ ps axo pid,comm,nice,cls --sort-nice PID COMMAND NI CLS 33 khugepaged 19 TS 32 ksmd 5 TS 814 rtkit-daemon 1 TS 1 systemd 0 TS 2 kthreadd 0 TS 5 kworker/0:0‑cgr 0 TS 7 kworker/0:1‑rcu 0 TS 8 kworker/u4:0‑ev 0 TS 15 migration/0 - FF ...output omitted...