我想根据服务器负载控制用户程序的执行。每个用户都使用 bash。有没有办法创建某种队列,其中命令行命令的执行将一直处于挂起状态,直到资源可用?
谢谢阿尔曼。
答案1
Arman,你建议的范例是大型机的严格时间共享模型。在大型机中,一个进程将主导机器,直到它完成或暂停。随着时间的推移,人们厌倦了失控的作业,内核开始更频繁地介入,将进程搁置,以便其他进程可以轮流。这个功能称为调度程序。和我一起思考一分钟。
调度程序需要做大量的工作,以便每个使用系统的人都感觉系统在执行他们的命令,即使一次只有一个进程轮流执行。现在有了多个 CPU 和后来的核心,计算机真的可以同时做多件事。在多核系统上,计算机“忙碌”的概念有点模糊。在 Linux 中,进程是已分配一个 CPU 并且有一个亲和力虽然调度程序保留将进程移动到另一个核心的权利,但在暂停和恢复时仍需要对其进行监视。
因此,您的实际需求可以在此场景中表达。有三个人被授予访问您新系统的权限:Michelle、Nick 和 Orville。这三个人都想看看计算机在著名的光线追踪器中渲染复杂帧的速度有多快,POV-射线。Michelle 是你的首席开发人员,老板说她可以随心所欲地使用机器。Nick 是你的初级开发人员之一,老板说只要不干扰 Michelle 偶尔进行的帧渲染,他就可以工作。Nick 对机器更感兴趣,各种乐趣都排好了队。Orville 在图形部门工作,老板只想让他看图片和场景文件,但不想让 Orville 干扰任何渲染。为了保持整洁有序,我们将有三个用户组:员工、新手和局外人。我不建议使用这些名称,除非你想被添加到最后一个组。摘录如下/etc/group
:
staff:1001::michelle,theboss
newbie:1002::nick,alode,ian
outsider:1003::orville
raytracers:1004::staff,newbie
我们将采用双管齐下的方法来解决这个问题。第一管是限制,第二管是简单文件权限(chmod
和chgrp
)。
首先,我们来处理限制。可插入式身份验证模块 (PAM) 通过其pam_limits
模块强制执行这些限制。我们将确保在下面正确配置它。查看手册页以了解limits.conf
您可以强制执行的限制类型的详细信息。这里有两个重要的术语:软限制和硬限制。软限制应始终小于硬限制。硬限制是一旦设置就无法更改的上限。如果用户希望在即将被压缩时收到警告,则使用软限制,如果允许用户使用命令更改它,则软限制也可用作默认设置ulimit
。的详细信息ulimit
可能在您的 shell 的手册页中(例如man bash
)。我们对硬限制感兴趣,因为我们将使用它来执行肮脏工作的 The Enforcer。尝试ulimit
一段时间,直到您了解效果并看到数字是您理解的。
现在到了棘手的部分。棘手是因为如果你做错了,Michelle 或 Nick 会向你或你的老板抱怨。Michelle 可能会抱怨 Nick 干涉,而 Nick 可能会抱怨他无法任何新系统上的时间。请注意,这不是技术问题,而是您对老板的期望的解读,并将其转化为系统配置的最佳猜测。沟通现有的限制可能会减轻您的痛苦。
因此,让我们以一种不会让 Nancy 感到不安的方式对 Nick 和 Orville 设置这些限制。我们将详细说明newbie
组设置。
- 最大调度优先级设置为 15。20 是默认值,也是最低优先级。
- 最大内存消耗限制为 1 GB。鉴于这是光线追踪,这限制了场景的复杂性。
需要注意的是,我们打算将所有员工工作的默认优先级设置为 15,最高优先级为 10。是的,在这种情况下,15 小于 10,因为对于非 root 用户来说,20 是最低优先级,而 0 是最高优先级。如果你倒立起来,就更容易理解了。
需要说明的是,我使用的是 Ubuntu 系统,具体来说,您的情况可能会因发行版的 PAM 设置方式而异。pam_limits
我的系统上有以下几行,session required pam_limits.so
位于以下文件中:
/etc/pam.d/login
/etc/pam.d/sshd
/etc/pam.d/cron
/etc/pam.d/at
/etc/pam.d/su
/etc/pam.d/sudo
/etc/pam.d/gdm
/etc/pam.d/gdm-autologin
然后,让我们将限制放入 或/etc/limits.conf
中的各个文件中/etc/limits.d/
。如果这是千载难逢的交易,那么就将其放入 中/etc/limits.conf
,但明智的做法是创建一个文件/etc/limit.d/raytracers
,并将这些行放入其中(我们将在此过程中限制 Orville)。有关详细信息,请参阅 的手册页limits.conf
,示例位于 中/etc/limits.conf
。
@newbie hard data 1024000
@newbie soft priority 20
@newbie hard priority 15
@newbie hard maxlogins 1
@outsider hard data 102400
@outsider soft 20
@outsider hard 20
@outsider hard maxlogins 1
@staff hard priority 10
@staff soft priority 15
用户需要注销并重新登录才能使更改生效。不过,你要聪明一点,在将这些限制交给用户之前先测试一下。使用命令ulimit
检查设置是否得到应用。需要 maxlogins,因为限制已应用每个登录 shell用户可以通过多次登录来绕过它们。
好的,我们终于锁定了用户,这样工作人员就总能轮流使用机器。现在轮到观察员了。这很难,因为你必须想办法弄清楚观察员意味着什么。你有几百个标准命令不想被锁定。因此,你要么想防止选定的应用程序运行,要么想强制它们运行单个主应用程序。添加 X-Windows(GNOME 或 KDE)确实使这变得非常复杂,需要你付出大量努力。因此,你可能只想限制它们可以占用多少 CPU 时间(当然是通过限制),然后就这样了。
但是,也许你为访问 POV-Ray 付出了大笔金钱,而老板却想阻止观察者运行。只需执行chgrp -R raytracers /directory/with/application/and/settings
。然后,确保顶层树具有 的权限,750
这样观察者甚至无法进入目录并运行该程序。
如果您只希望观察者运行特定应用程序,则您有两个选择。如果它是严格的文本环境,则将其 shell 设为程序名称并确保该程序处于 中/etc/shells
。您可能必须对 PAM 模块做出一些例外,以防止用户执行scp
或ftp
。如果它是图形环境,您将不得不修改您的窗口环境。图形环境相当复杂,无法完全锁定,需要您进行一些实验。
这是一个测试问题:我们如何强制员工的工作始终超过新手和观察员的工作?(提示:查看我们的条目/etc/limit.d/raytracers
)
答案2
使用at
/batch
命令。
(例子)
答案3
阿尔曼,
我花了几分钟思考你的问题,我想说,你可能完全走错了方向。这根本不符合 'nix 的设计运行模式。
shell 通常会生成大量的小进程;它们将输入和输出从一个进程传输到另一个进程,并且此系统中的任何延迟都会使其几乎无法使用。如果您的系统资源如此之多,以至于用户无法在不排队的情况下运行 grep,那么他们就会发疯。
我建议研究其他方法。一种方法是尝试按每个进程或每个用户设置“良好”级别。如果您的用户正在运行占用大量资源的作业,也许可以限制他们启动这些特定作业进行排队的方式,但作业本身的运行方式应该针对此用例进行更新。
另一件需要考虑的事情是使用虚拟服务器或其他半虚拟客户端将用户隔离在虚拟环境中,从而允许他们使用有限的整体服务器资源。
希望这对你有所帮助。如果你分享更多关于人们正在运行哪些类型的任务会消耗如此多的资源的信息,也许人们可以提供更精确的解决方案。就目前而言,我只想说,这听起来确实像是你在用错误的工具解决问题,有点像为了防止汽车爆胎而把车轮拆下来,然后像雪橇一样拖着它。明白我的意思了吗?
迦勒