我有 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 资源以充分利用您的系统。在大多数情况下,您可以添加的任何内容都是降低你的整体效率。
除非您的计划实际上以某种方式削弱进程(并且在某些情况下您可能确实打算这样做),否则您不想使用taskset
,control groups
或者LXC/Docker
为了获得最佳性能。