Mysql 高内存消耗
最近我从 Debian 服务器迁移到了 Ubuntu 服务器,我注意到mysqld
Ubuntu 服务器的内存消耗非常高,但几乎没有用处......
解决方案?
我想知道是否有任何方法可以限制这种内存消耗,因为它确实使我的服务器处于危险的无响应状态?
答案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
- 将新组与需要控制的流程关联。
- 如果进程当前正在运行,请输入以下命令使用 cgclassify
cgclassify -g memory,cpu:sqlgroup $(*PID of mysql process*)
- 如果进程没有运行,您可以通过输入以下命令来使用 cgexec
cgexec cpu,memory:sqlgroup *processName* *additional arguments*
- 如果进程当前正在运行,请输入以下命令使用 cgclassify
方法二:手动配置
您也可以使用以下命令手动完成此操作,而无需安装其他软件包(笔记:您必须拥有 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 的更多高级配置选项可以在这里找到这里。