我如何限制 mysqld 内存消耗?

我如何限制 mysqld 内存消耗?

Mysql 高内存消耗

最近我从 Debian 服务器迁移到了 Ubuntu 服务器,我注意到mysqldUbuntu 服务器的内存消耗非常高,但几乎没有用处......

解决方案?

我想知道是否有任何方法可以限制这种内存消耗,因为它确实使我的服务器处于危险的无响应状态?

答案1

我会使用控制组来完成你的要求。

遵循以下说明之前,请先阅读:我在 RedHat 的文档网站上看到,libcgroups 最近已被弃用。RedHat 提供了使用 systemd 创建控制组的指南这里

另外,在下面描述的方法中,*text* 表示用户定义的数字或文件名。

方法 1:libcgroups(显然已弃用)

您可以通过输入来安装 libcgroups,它包含一系列用于创建 cgroup 的实用程序,例如 cgcreate 和 cgclassify sudo apt install libcgroups。安装后,执行以下操作:

  • 创建一个名为 sqlgroup 的 cgroup(或任何你想叫的名字)
    • 类型cgcreate -g memory,cpu:sqlgroup
  • 设置内存限制。
    • cgset -r memory.limit_in_bytes=$((*mathExpressionForDesiredLimit*)) sqlgroup
  • 将新组与需要控制的流程关联。
    • 如果进程当前正在运行,请输入以下命令使用 cgclassifycgclassify -g memory,cpu:sqlgroup $(*PID of mysql process*)
    • 如果进程没有运行,您可以通过输入以下命令来使用 cgexeccgexec cpu,memory:sqlgroup *processName* *additional arguments*

方法二:手动配置

您也可以使用以下命令手动完成此操作,而无需安装其他软件包(笔记:您必须拥有 systemd 232 或更高版本。systemctl --version | grep systemd提供当前版本信息):

  • mkdir /sys/fs/cgroup/memory/groupname这会在 [...]/cgroup/memory 下创建一个文件夹,指定该 cgroup 将控制内存。笔记:将组名更改为与要限制的进程相对应的名称。您可以随意命名。在之前的方法中,我描述的组名为 sqlgroup。
  • 通过在您创建的 groupname 文件夹下创建一个包含内存限制(以字节为单位)的文件来设置进程的内存限制。可以使用以下方法完成此操作:echo amount_in_bytes > /sys/fs/cgroup/memory/groupname/memory.limit_in_bytes。不要更改 memory.limit_in_bytes 的名称。
  • 将要限制的进程的 PID 移到 cgroup.procs 文件中。可以使用 创建echo *PID_Number* > /sys/fs/cgroup/memory/groupname/cgroup.procs笔记:如果要限制具有不同 PID 的多个进程,则必须手动将每个 PID 输入到 cpgroup.procs 文件中。

有关 cgroups 的更多高级配置选项可以在这里找到这里

相关内容