CRON 作业在内存不足时执行命令

CRON 作业在内存不足时执行命令

hdbsql我遇到过这样的情况:当内存太低时,我可能需要执行 SAP 命令行工具(以帮助清理 HANA 表缓存)。

我怎样才能最好地解决这个问题?我确实有一个想法,在使用 安排的 shell 脚本中从命令中提取可用内存值top(或获取 free/max*100 来获取 %,这更好)crontab,但我在任何地方都找不到任何可能的方法,所以我什至无法开始任何事情。

答案1

您可以用来awk计算百分比和test例如,用于确定该值是否超过 90% 的实用程序。 cronjob 可能如下所示:

/usr/bin/test 90 -le $(/usr/bin/awk '$1=="MemTotal:"{t=$2} $1=="MemFree:"{f=$2} END{printf "%d", (t-f)/(t/100)}' /proc/meminfo) && command-to-cleanup

awk部分从 中提取所需的值/proc/meminfo,然后计算已用内存的百分比。该test实用程序检查 90 是否小于或等于 ( -le) 计算值。之后的部分&&将成为清理内存的工具 ( .. && command-to-cleanup)。该 cronjob 可以每分钟运行一次,例如:

* * * * * root /usr/bin/test 90 -le $(/usr/bin/awk '$1=="MemTotal:"{t=$2} $1=="MemFree:"{f=$2} END{printf "%d", (t-f)/(t/100)}' /proc/meminfo) && command-to-cleanup

答案2

恕我直言,在这种情况下,Linux 系统上的可用内存百分比并不是一个好的指标,因为 Linux 内存管理的工作方式(内存也用于缓冲和缓存,还有交换等)——有大量信息主题。这意味着使用这样的指示器会导致比实际需要更早地清理缓存,我想这会牺牲整体性能。

我发现,考虑到所有这些因素,使用的交换百分比通常可以更好地表明系统内存不足:只要它仍然可以分配内存,它通常就不会使用交换。

作为一个额外的好处,这也可以作为一个性能指标 - 例如,使用超过 4G 交换空间的系统通常几乎无法爬行(想想将 4G 磁盘文件从一个地方复制到另一个地方需要多少时间)。

交换信息可以在/proc/内存信息,因此 Chaos 建议的方法可以进行相应调整:

SwapTotal:      16777212 kB
SwapFree:       16777212 kB

您可能需要进行一些试验才能找出哪个交换使用百分比值更适合您的特定情况。

相关内容