iotop出现SWAPIN使用率很高99.99%的处理

定义:SWAPIN

依据 iotop的参考手册,定义为:
the percentage of time the thread/process spent while swapping in
进程或者线程花费在交换内存时间的百分比。
如果出现SWAPIN百分比很高,可以肯定内存不足了,赶快通过free -h 查看一下内存情况,并合理优化内存相关配置。

缘由

最近在优化MySQL数据库,处理上亿数据的导入,通过优化innodb的配置,使用LOAD INFILE达到了每秒15K左右的插入速度。

运行一段时间后,发现继续入库速度会减慢,使用IOTOP发现写的速度很低,而SWAPIN的负载很高,达到99.99%,网络上相关信息很少。一旦出现这个现象,mysql反应很慢。

经过检查,发现系统内存可用空间很少,SWAP分区占用50%以上,发现是MySQL进程占用空间太大导致,通过修改缓存大小改善这个问题:

// 修改缓存到12GB=12*1024*1024*1024
SET GLOBAL innodb_buffer_pool_size=12884901888;
// 通过如下命令查看改变的状态
SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';

通过释放更多的可用空间做为内存交换,而不是使用磁盘的SWAP空间,加快系统的运行。
我的服务器配置如下:
256GB RAM, 双CPU 共 40 Cores
采用docker部署MySQL容器16个,配置如下:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
max_connections=1000

explicit_defaults_for_timestamp=true

slow-query-log = off
#slow_query_log_file = /var/log/slow-query.log
#long_query_time = 1
#log-queries-not-using-indexes = on

## InnoDB options
innodb_adaptive_flushing        = 1
innodb_buffer_pool_instances    = 4
innodb_buffer_pool_size         = 12G
innodb_file_per_table           = 1
innodb_flush_log_at_trx_commit  = 2
innodb_flush_method             = O_DIRECT
innodb_io_capacity              = 800
innodb_log_file_size            = 7G
innodb_log_files_in_group       = 4
innodb_log_buffer_size          = 64M
innodb_max_dirty_pages_pct      = 50
innodb_read_io_threads          = 32
innodb_write_io_threads         = 16
innodb_thread_concurrency       = 64


max_allowed_packet              =100MB

前期,我把innodb_buffer_pool_size设置为16GB,结果每一个MySQL进程占用20GB,实际使用达到16GB,16个MySQL把内存耗尽,导致MySQL处理速度变慢。
我是按照256GB/16 = 16GB,按75%内存估算,配置为12GB。

外号:如何提高入库速度

在处理数据入库时,我的文件是通过程序生成,到达10多个字段,而且主键索引是字符串,还带其他索引,目前优化可以到15K左右,100W记录在55s左右,约18K,如果出现SWAPIN占用很高时,入库速度只有6K多。

提高入库速度主要依赖于服务器的硬盘速度,原来在老机器上操作,速度提升有限,基本在7~8K。
由于入库对并发利用率不高CPU多核性能利用不上,甚至比不上台式机,可是如果磁盘速度提升,入库速度就会有大幅度提升。10000转的机械硬盘就比不上15000转的。

主要优化两个地方:
innodb_buffer_pool_size 这个设置为可用内存的75%(官宣)
innodb_log_file_size 日志文件大小,这个依赖于入库的数据量,通过提高该参数,实现尽量少的刷盘,提高入库速度。如何计算合理的日志文件大小参见文章: How to calculate a good InnoDB log file size

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值