Monit可以用来释放内存吗?

Dou*_*eed 3 memory monitoring restart monit

我已经使用 monit 来监视和重新启动 Apache 和 MySQL 几个月了,一切都工作正常,直到今天,当服务器上的某些内容导致内存利用率超过 90% 时,MySQL 停止并 monit 然后尝试不断重新启动,但是有内存不足,无法重新启动。

完整的服务器重新启动对所有内容进行了排序,因此现在再次正常运行。

我的问题是,例如,当超过 90% 时,我可以让 monit 监控服务器 RAM 利用率并释放 RAM 或重新启动服务器等吗?

saa*_*aaj 7

产能规划

关于 MySQL 和 Apache 内存消耗的说明。两者或多或少都是确定性的,您应该事先进行一些容量规划,而不仅仅是每次由于配置错误而无法承受负载峰值时重新启动服务器。对于 MySQL,将所有分配的缓冲区、缓存、线程缓存(准备服务线程的数量)及其堆栈大小等相加,即可得到数字。MySQLTuner可以为您做到这一点——该行看起来像这样(除了其他重要指标之外):

[OK] Maximum possible memory usage: 352.0M (48% of installed RAM)
Run Code Online (Sandbox Code Playgroud)

对于 Apache,这更困难,但经验方法应该是可行的方法。Apache 配置中的工作线程数量有限,您只需估计每个工作线程的平均内存消耗 - 查看pstop等。然后将该值乘以工作线程数量。如果您运行类似mod_php的东西,那么还有一种方法可以限制运行时的内存使用。

监控端

Monit 可以在达到某个限制(例如消耗的内存)时重新启动服务(例如 MySQL)。但在大多数情况下这样做是错误的,因为 MySQL 维护缓冲区和缓存并为客户端提供服务。重新启动会导致性能下降和服务中断。仅当您无法以任何其他方式限制内存消耗时才使用它。例如:

check process mysql with pidfile /var/run/mysqld/mysqld.pid
  start program = "/etc/init.d/mysql start"
  stop program = "/etc/init.d/mysql stop"

  if totalmem > 256 MB for 10 cycles then restart

  group database
Run Code Online (Sandbox Code Playgroud)

还可以监视系统范围的内存消耗,但要注意 Linux 内存模型很复杂,很难判断一个进程真正消耗了多少内存。系统范围的指标(例如可用内存)也可能具有误导性,因为应该考虑磁盘缓存(缓存内存)、共享库内存和许多其他方面的值。

以下是 Monit 默认 Debain 默认配置的示例:

check system myhost.mydomain.tld
  if loadavg (1min) > 4 then alert
  if loadavg (5min) > 2 then alert
  if memory usage > 75% then alert
  if cpu usage (user) > 70% then alert
  if cpu usage (system) > 30% then alert
  if cpu usage (wait) > 20% then alert
Run Code Online (Sandbox Code Playgroud)

您可以使用exec操作 ( then <ACTION>) 来重新启动服务器,但我真的不建议您遵循此路径,而是做一些容量规划。