使用 tasket 为特定用户的所有进程设置 CPU 亲和性

使用 tasket 为特定用户的所有进程设置 CPU 亲和性

我有 ubuntu server 14.04,我想知道是否有任何简单的方法来完成这项任务。

例如,我已经可以使用 对单个进程执行此操作taskset -pac 2 29435,但有没有办法通过用户名而不是进程 ID 来分配它?

先感谢您。

答案1

什么也不要做。真的什么也不要做。

如果您的目的是尽可能高效地分配资源,那么正确的做法是让操作系统根据需要和必要将进程移动到相关的 CPU。

  • 如果所有进程都同时需要 CPU,那么操作系统将会以某种方式迁移它们,使它们在不同的处理器上运行。
  • 如果某个进程大部分时间处于空闲状态,那么最好让它与其他进程共享一个 CPU。

对于性能优化而言,限制 CPU 资源或使用量永远不是一个好主意——你只会让性能变得更糟。你只需要限制 CPU 资源或可以在你所在的位置使用的 CPU故意地试图破坏这一进程。

您可能想要削弱某个进程的情况如下:

  • 您是托管服务提供商,并为资源消费者提供可用资源的最小/最大限制。
  • 该进程编写得非常糟糕/行为不当,会不正确地消耗给定系统上的所有资源,从而导致其他进程停止运行。这样做会使您的负载激增,但可以“避免”系统不必要地消耗可用于其他用途的 CPU。在这种情况下,您通常会寻求实际修复该程序作为正确的修复。

所以 - 什么也不要做,让操作系统来处理。实例运行一段时间后(如果它们确实占用大量 CPU),您可以运行该命令ps -Lo psr,pid,tid $(pgrep <processname>),然后会看到每个资源在 CPU 上都得到了正确的分配。

如果您想确定每个进程是否都获得了公平的份额,以及每个程序中实际利用了多少,您可以执行以下操作替换进程名称并获得以下结果:

$ ps -Lo psr,pid,tid,etime,cputime,comm $(pgrep firefox)
PSR   PID   TID     ELAPSED     TIME COMMAND
  2  3400  3400  1-07:16:10 01:22:29 firefox
  2  3400  3425  1-07:16:10 00:00:00 gdbus
  2  3400  3426  1-07:16:09 00:00:00 Gecko_IOThread
  3  3400  3427  1-07:16:09 00:00:00 Link Monitor
  1  3400  3428  1-07:16:09 00:02:50 Socket Thread
  1  3400  3429  1-07:16:09 00:00:00 firefox
  0  3400  3430  1-07:16:09 00:00:25 JS Helper
  3  3400  3431  1-07:16:09 00:00:26 JS Helper
  3  3400  3432  1-07:16:09 00:00:25 JS Helper
  1  3400  3433  1-07:16:09 00:00:25 JS Helper
  1  3400  3434  1-07:16:09 00:00:26 JS Helper
  3  3400  3435  1-07:16:09 00:00:25 JS Helper
  0  3400  3436  1-07:16:09 00:00:25 JS Helper
  0  3400  3437  1-07:16:09 00:00:26 JS Helper
  2  3400  3438  1-07:16:09 00:00:02 JS Watchdog
  2  3400  3439  1-07:16:09 00:00:00 Hang Monitor
  1  3400  3440  1-07:16:09 00:00:00 BgHangManager
  3  3400  3441  1-07:16:09 00:00:32 Cache2 I/O
  0  3400  3442  1-07:16:09 00:02:41 Timer
  3  3400  3444  1-07:16:09 00:00:00 GMPThread
  2  3400  3447  1-07:16:09 00:07:24 Compositor
  0  3400  3448  1-07:16:09 00:01:08 ImageBridgeChil
  3  3400  3449  1-07:16:09 00:00:31 ImgDecoder #1
  1  3400  3450  1-07:16:09 00:00:32 ImgDecoder #2
  3  3400  3451  1-07:16:09 00:00:31 ImgDecoder #3
  2  3400  3452  1-07:16:09 00:00:00 ImageIO
  2  3400  3453  1-07:16:09 00:04:07 SoftwareVsyncTh
  0  3400  3454  1-07:16:08 00:00:00 firefox
  2  3400  3455  1-07:16:08 00:00:00 Cert Verify
  2  3400  3456  1-07:16:08 00:00:00 IPDL Background
  0  3400  3457  1-07:16:08 00:00:37 DOM Worker
  2  3400  3458  1-07:16:08 00:00:03 HTML5 Parser
  2  3400  3462  1-07:16:07 00:00:01 mozStorage #1
  1  3400  3463  1-07:16:07 00:00:00 Proxy R~olution
  1  3400  3464  1-07:16:07 00:00:49 URL Classifier
  2  3400  3466  1-07:16:07 00:00:02 mozStorage #2
  0  3400  3467  1-07:16:07 00:00:00 gmain
  3  3400  3468  1-07:16:07 00:00:00 Cache I/O
  3  3400  3471  1-07:16:07 00:00:00 mozStorage #3
  2  3400  3477  1-07:16:07 00:00:35 DOM Worker
  2  3400  3479  1-07:16:07 00:00:00 mozStorage #4
  0  3400  3482  1-07:16:07 00:00:00 localStorage DB
  2  3400  3483  1-07:16:07 00:00:03 mozStorage #5
  1  3400  3519  1-07:15:57 00:00:00 mozStorage #6
  2  3400  3537  1-07:14:09 00:00:31 DOM Worker
  0  3400  3562  1-07:08:35 00:00:00 mozStorage #7
  0  3400  3587  1-06:59:39 00:00:00 threaded-ml
  2  3400  3597  1-06:49:40 00:00:00 mozStorage #8
  2  3400  7594  1-01:36:55 00:00:34 threaded-ml
  3  3400 11679    10:48:07 00:00:00 firefox
  2  3400 11684    10:48:07 00:00:00 typefind:sink
  2  3400 11687    10:48:07 00:00:00 typefind:sink
  1  3400 11689    10:48:07 00:00:00 typefind:sink
  0  3400 11690    10:48:07 00:00:00 mpegaudioparse0
  1  3400 11691    10:48:07 00:00:00 mpegaudioparse1
  2  3400 11692    10:48:07 00:00:00 mpegaudioparse2
  0  3400 11693    10:48:07 00:00:00 aqueue:src
  1  3400 11694    10:48:07 00:00:00 aqueue:src
  1  3400 11695    10:48:07 00:00:00 aqueue:src
  2  3400 22770    05:38:46 00:00:00 firefox
  3  3400 29803       10:17 00:00:00 DNS Res~er #226
  3  3400 30018       01:28 00:00:00 DNS Res~er #228

在这个例子中,我在我的机器上使用 Firefox,但您可以更改进程名称以满足您的需要。

在这里,我请求进程中的每个线程。各列的含义如下:

  • PSR 是分配给该任务的处理器编号。
  • PID 是进程 ID。
  • TID 是线程 id。(主进程的 tid 等于其 pid)
  • ELAPSED 提供进程已运行的总时间。基本上就是进程启动后的总时间。
  • TIME 是进程在 CPU 上实际运行的总时间。
  • COMMAND 是进程声明的命令名称。在这里你可以看到每个实际线程都被赋予了一个特定的名称,大概是用来描述其用途的。

要确定某个进程在其生命周期内的利用率(以百分比表示),您可以执行以下计算(我使用的是 Firefox):

TIME     /    ELAPSED * 100  = UTIL
112570   /    4949    * 100  = 4.40

笔记:实际进程 ID(tid == pid 的主启动线程)充当所有线程(现有或不再存在)CPU 时间累计总数的“容器”,因此可以为您提供对进程整体使用情况的合理准确描述。

解释一下,如果进程的生命周期等于其 CPU 时间,则意味着在进程存在的所有时间内,它都需要并接收 CPU 来运行。这相当于 100% 的 CPU 利用率。

我几乎可以肯定,实际上你会发现你的进程几乎不使用任何 CPU。

因此,重申一下,为了尽可能高效地执行,什么也不要做,因为您的内核知道如何最好地优先考虑 CPU 资源以充分利用您的系统。在大多数情况下,您可以添加的任何内容都是降低你的整体效率

除非您的计划实际上以某种方式削弱进程(并且在某些情况下您可能确实打算这样做),否则您不想使用tasksetcontrol groups或者LXC/Docker为了获得最佳性能。

相关内容