2010-07-19 77 views
1

我制作了一个Bash提示符,当工作目录是Git存储库时,显示当前系统信息库的名称。此外,它包含了当前正在进行的任务以及花在做它的时间(从自制计时工具)。这当然意味着只显示提示意味着运行两个进程。检测系统负载,重点是Linux中的“交换抖动”

这样做的缺点是,如果系统由于某种原因发生颠簸,则需要一个提示来做必要的事情来保存系统,因为只需加​​载git二进制文件就不会问系统了这样的状态。

所以,现在,默认情况下提示是禁用的,并且只在需求时启用,但这并不舒服。在.bashrc中检测负载会更好,并且只有在系统运行正常(即具有可接受的磁盘延迟)时才启用提示。

在这种情况下,CPU相当便宜,只有磁盘价格昂贵。所以我需要一种能够在不依赖外部工具的情况下检测抖动的方法。

提示:/proc可能有用。例如。 /proc/loadavg会解决我的问题,如果它是导致瓶颈的CPU,而不是磁盘。

+0

我会说你的提示可能有点太聪明了。试图在系统处于交换过程中尝试运行的程序,即使只是为了检查它是否应该运行,也会阻止等待核心(模优先级队列和随机机会)。我在此将其配置为Catch-22提示符:必须运行的程序以确定它是否有能力运行;) – msw 2010-07-19 06:21:09

+0

如果可以在bash中完全解决它,那么没有问题? – mvds 2010-07-19 06:40:55

+0

@mvds:那甚至会是首选! – AttishOculus 2010-07-19 07:41:15

回答

2

vmstat可以帮助你。如果你不想使用它,所有的信息都在

  • 的/ proc/meminfo中
  • 的/ proc/STAT
  • 的/ proc/PID/STAT
2

最简单的方法将检查/proc/loadavg的第一个字节,只有继续当它是一个0

这将工作

loadavg=$(</proc/loadavg) 
if [ "${loadavg:0:1}" = "0" ]; then echo "all clear"; fi 

但是你仍然有test(或[)可能会运行,虽然这可能是一个内置的bash。 编辑^ 2这是一个内置的至少在bash 3.2.39,但我怀疑它已经内置了很长一段时间。所以这可以在没有另一个过程的情况下完成

编辑^ 3:更新,细粒度控制:

if [ "${loadavg:0:1}${loadavg:2:2}" -lt "60" ]; then echo "below 0.6"; fi 

编辑^ 4:我无法想象,磁盘I/O是用于手边的问题的瓶颈。只要你不写,但只能从缓存的地方读取,这是纯粹的内存/ CPU问题。

编辑^ 5:当然,这是对于1个CPU的情况下,通过内核的数量乘以该阈值百分比(HT处理器,以“核”的一半,以确保)

+0

任何人都可以将'$(<...)'集成到'$ {... ::}'中,这似乎是不可能的。 – mvds 2010-07-19 06:34:05

+0

有趣的是,''bash' * *会分叉读取'/ proc/loadavg'。猜测除了修补'bash'之外,你无能为力。 – mvds 2010-07-19 06:51:29

+0

@mvds:外壳几乎可以做任何事情。 – 2010-07-19 06:54:41