全新安装 mysql 后,服务器使用 100% 交换空间

全新安装 mysql 后,服务器使用 100% 交换空间

我建立了一个具有 220G RAM 和 Ubuntu 22.04.1 LTS 的新服务器。

安装 MySQL 后,我将 mysql 配置更改为:

innodb_buffer_pool_size = 170G
innodb_buffer_pool_instances = 64
innodb_buffer_pool_chunk_size = 134217728
innodb_log_file_size = 13G
collation_server = utf8_unicode_ci
character_set_server = utf8
sql-mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,IGNORE_SPACE,NO_ENGINE_SUBSTITUTION"
user = mysql
datadir = /mnt/data/mysql/data
tmpdir = /mnt/data/mysql/tmp
key_buffer_size = 32M
thread_cache_size = 32
myisam-recover-options = BACKUP
log_error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_bin = /mnt/data/mysql/log/mysql-bin.log
max_binlog_size = 2G

/mnt/data是一个400G的lvm分区。

我也安装了MySQL 导出器节点导出器。在我安装这两个导出器之前,数据库导入没有任何问题,但如果现在要导入数据库(约 150G 未压缩),SWAP 分区会被完全占用,但 RAM 只使用了 85%。

现在我想找出哪个进程负责 SWAP 负载。

我如何列出每个进程使用了​​多少交换空间?

如果可能的话我想保留交换性值默认。

编辑:

  • 将 SWAP 增加到 64 GiB
  • 对于导入,我将 swappiness 降低到 10
  • 导入后我将 swappiness 设置为 50

该服务器已经运行了 2 个月,导入后我没有遇到任何与交换分区有关的问题。

答案1

我喜欢swappiness=1主要使用 MySQL 的服务器。

为了帮助解决问题,请降低innodb_buffer_pool_size。从 50GB 开始。毕竟,缓冲池是一个“缓存”。

当您“导入” 150G 数据时,这些数据存放在哪里?也许导入器正在将整个数据加载到 RAM 中?(这将是一个糟糕的设计。)大多数压缩/解压缩工具都乐于仅使用少量 RAM,但可以在磁盘上读取/写入非常大的文件。

远程备份

如果您的备份位于主机“backup”上,并且正在“db”上重新加载 mysql,请考虑在“backup”上运行此操作:

zcat backup.sql.gz | mysql -h db ...

这样就无需使用“db”上的磁盘空间来压缩 zip 文件。此外,它可能需要更少的时间全面的时间。(我不认为它会影响任何一台机器上的“交换”使用。)

(类似地,您可以从“备份”中获取转储。)

答案2

作为简单的解决方案,您可以使用mysqltuner 脚本

调整脏页设置:

sysctl -a|grep vm.dirty

共享内存设置相同:

sysctl -a|kernel.shm

如果您的 mysql 实例不使用 RAM 并且占用了 100% 的交换空间,我认为调整 vm.swappiness 不会有太大作用。考虑使用以下命令检查 RAM 使用情况:ps_mem公用事业。

参考:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_monitoring_and_updating_the_kernel/adjusting-kernel-parameters-for-database-servers_managing-monitoring-and-updating-the-kernel

答案3

这听起来像是一个积极的交换配置,我认为它很高,所以系统很早就开始交换。

系统默认值较高(60%),具体取决于环境,可能足够也可能不够。

您可以使用以下方式检查当前的 swappiness 值;

$ sysctl vm.swappiness

由于您似乎正在积极地交换,因此设置较低的值将会有益。

要改变该值,您可以使用;

$ sysctl vm.swappiness=10

答案4

我没注意到。但我担心性能会突然变差或 MySQL 会崩溃。目前我只有 4G 的交换空间。服务器上只应运行 MySQL,并且永远不应使用交换分区。我可以增加交换分区(它也是一个 lvm 分区),但理想情况下永远不会使用它。

你没有问题。你您要使用的交换。

当你启动一台机器时,会有很多进程运行。其中许多进程会污染内存,从而绝不在系统运行的整个过程中使用。例如,对于仅启动一次的程序,启动代码会出现错误。

将此垃圾写入交换有三个原因:

  1. 这东西不能在没有先将其写入交换区的情况下,被从 RAM 中逐出。系统无法证明它永远不会被访问。例如,其中一些可能包含彻底关闭某些服务器进程所需的数据。丢弃唯一的副本将违反健全性保证。

  2. 如果系统内存紧张,I/O 就变得非常重要。如果能够从内存中清除这些数据,性能将大有裨益。但这只能通过将其写入交换来实现第一的。如果已经将其写入交换区,则在 I/O 宝贵时无需将此数据写入交换区。因此,根据设计,只要“有空”就会将其写入交换区。

  3. 通过从内存中清除这些垃圾,更多的 RAM 可用作 I/O 缓存。这意味着更多的正在重复使用的干净页面可以保存在内存中,从而提高性能。

由于 4GB 的垃圾可能永远不会在具有超过 200GB RAM 的系统上使用,因此可以将其驱逐,这是完全合理的,并且绝对没有理由不希望将其写入交换区。

相关内容