记一次MySQL运维
[root@b2btest ~]# free -h total used free shared buffers cached Mem: 125G 124G 780M 13M 28K 238M -/+ buffers/cache: 124G 1.0G Swap: 30G 7.5G 22G
分析现象;
首先,可以看到,free部分已经严重不足,swap被大量启用。
而另一方面,cached部分的数据量非常低,而几乎所有的内存资源都被-/+ buffers/cache部分used,
初步分析:
buffer pool的设置过高,所有的数据都默认存储进了buffer pool中。在我的另一篇文章中,介绍了上面各个参数的含义,第一行的buffer指的是未被使用的量。
这导致了两个问题;
一个是内存资源被大量占用,free部分严重不足。
另一个是缓存区没有得到使用,因为所有数据都优先导入了buffer pool中。
因为缓存区没有被使用,所以即使内存的free部分已经不够用了,系统缓存也无法自动释放空间。
当这个矛盾产生后,系统就开始启用swap分区。
解决思路:
将数据,从buffer pool与swap里,全部挤压出来到cached中。再将 cached中的数据释放到磁盘内。使得内存中的空间得到释放。
先找到占用的具体进程
top - 11:35:12 up 343 days, 14:36, 4 users, load average: 2.67, 2.04, 1.97 Tasks: 573 total, 1 running, 572 sleeping, 0 stopped, 0 zombie %Cpu(s): 10.2 us, 0.6 sy, 0.0 ni, 89.2 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st KiB Mem: 13178910+total, 13094849+used, 840604 free, 28 buffers KiB Swap: 31743996 total, 7844364 used, 23899632 free. 244900 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 110214 mysql 20 0 0.130t 0.117t 6940 S 129.1 95.3 58010:03 mysqld
这是台mysql专用服务器,系统资源全部被MySQL占用,要释放内存,就业从MySQL内部解决;
mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES
默认存储引擎为innodb,
mysql> show engine innodb status; 截取以下段落 ---------------------- BUFFER POOL AND MEMORY ---------------------- Total large memory allocated 120937512960 Dictionary memory allocated 33079802 Buffer pool size 7208520 Free buffers 8193 Database pages 7199249 Old database pages 2657374
找到原因。开始处理
mysql> show variables like "%innodb_buffer_pool%";
截取以下参数
+-------------------------------------+----------------+
| Variable_name | Value |
+-------------------------------------+----------------+
| innodb_buffer_pool_chunk_size | 134217728 |
| innodb_buffer_pool_instances | 8 |
| innodb_buffer_pool_size | 118111600640 |
+-------------------------------------+----------------+
10 rows in set (0.00 sec)
mysql> select 118111600640-134217728*8*50;
计划释放50倍的数据块
+-----------------------------+
| 118111600640-134217728*8*50 |
+-----------------------------+
| 64424509440 |
+-----------------------------+
1 row in set (0.00 sec)
mysql> SET GLOBAL innodb_buffer_pool_size=64424509440;
Query OK, 0 rows affected (0.00 sec)
将112G的内存降低至60G
之后查看下系统内存。free -h。确认下修改是否生效
[root@b2btest ~]# free -h
total used free shared buffers cached
Mem: 125G 124G 839M 15M 40K 47G
-/+ buffers/cache: 77G 48G
Swap: 30G 7.4G 22G
从这里已经可以看到,可用缓存空间已经增加了50G左右,接下来释放SWAP文件
[root@b2btest ~]# swapoff -a
7.5G的swap文件,释放需要5个小时!!,从这里也可以明显体会到swap文件系统运行的缓慢。
[root@b2btest ~]# free -h
total used free shared buffers cached
Mem: 125G 124G 742M 459M 60K 41G
-/+ buffers/cache: 83G 41G
Swap: 0B 0B 0B
现在所有的数据,都已经被转移到cached中,接下来,释放缓存。
[root@b2btest ~]# sync
[root@b2btest ~]# echo 1 > /proc/sys/vm/drop_caches
[root@b2btest ~]# free -h
total used free shared buffers cached
Mem: 125G 83G 42G 459M 0B 42M
-/+ buffers/cache: 83G 42G
Swap: 0B 0B 0B
从缓存区释放40G数据,用时10秒左右。
[root@b2btest ~]# swapon -a
[root@b2btest ~]# swapon -s
文件名 类型 大小 已用 权限
/dev/sda3 partition 31743996 0 -1
重启swap分区。
在数据库保持正常运行的情况下,系统资源释放结束。