![全新安装 mysql 后,服务器使用 100% 交换空间](https://linux22.com/image/780485/%E5%85%A8%E6%96%B0%E5%AE%89%E8%A3%85%20mysql%20%E5%90%8E%EF%BC%8C%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%BF%E7%94%A8%20100%25%20%E4%BA%A4%E6%8D%A2%E7%A9%BA%E9%97%B4.png)
我建立了一个具有 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公用事业。
答案3
这听起来像是一个积极的交换配置,我认为它很高,所以系统很早就开始交换。
系统默认值较高(60%),具体取决于环境,可能足够也可能不够。
您可以使用以下方式检查当前的 swappiness 值;
$ sysctl vm.swappiness
由于您似乎正在积极地交换,因此设置较低的值将会有益。
要改变该值,您可以使用;
$ sysctl vm.swappiness=10
答案4
我没注意到。但我担心性能会突然变差或 MySQL 会崩溃。目前我只有 4G 的交换空间。服务器上只应运行 MySQL,并且永远不应使用交换分区。我可以增加交换分区(它也是一个 lvm 分区),但理想情况下永远不会使用它。
你没有问题。你想您要使用的交换。
当你启动一台机器时,会有很多进程运行。其中许多进程会污染内存,从而绝不在系统运行的整个过程中使用。例如,对于仅启动一次的程序,启动代码会出现错误。
你想将此垃圾写入交换有三个原因:
这东西不能在没有先将其写入交换区的情况下,被从 RAM 中逐出。系统无法证明它永远不会被访问。例如,其中一些可能包含彻底关闭某些服务器进程所需的数据。丢弃唯一的副本将违反健全性保证。
如果系统内存紧张,I/O 就变得非常重要。如果能够从内存中清除这些数据,性能将大有裨益。但这只能通过将其写入交换来实现第一的。如果已经将其写入交换区,则在 I/O 宝贵时无需将此数据写入交换区。因此,根据设计,只要“有空”就会将其写入交换区。
通过从内存中清除这些垃圾,更多的 RAM 可用作 I/O 缓存。这意味着更多的正在重复使用的干净页面可以保存在内存中,从而提高性能。
由于 4GB 的垃圾可能永远不会在具有超过 200GB RAM 的系统上使用,因此可以将其驱逐,这是完全合理的,并且绝对没有理由不希望将其写入交换区。