.swappingness=0 的解释,如果设置成0,可能会发生00M,而将mysqld给kill掉。新内核(2.6.32-303.el6及以后)推荐的做法是:
?
1)尽量保证Linux操作系统还有足够的内存;
?
2)最新的内核,建议把vm.swappiness设置1;
?
3)考虑设置 /proc/$(pidof -s mysqld)/oom_adj为较小的值来尽量避免MySQL由于内存不足而被关闭。
?
具体参见:http://www.woqutech.com/?p=1397
?
3. 如何修改 oom_adj 值
?
查看mysqld的oom_ajd值:
?
[root@localhost ~]# cat /proc/`pidof -s mysqld`/oom_adj
0
[root@localhost ~]# cat /proc/$(pidof -s mysqld)/oom_adj
0
默认值为0. 当我们设置为-17时,对于该进程来说,就不会触发OOM机制,被杀掉。修改:
?
[root@localhost ~]# echo -17 > /proc/$(pidof mysqld)/oom_adj
[root@localhost ~]# cat /proc/$(pidof mysqld)/oom_adj
-17
这里为什么是-17呢?这和Linux的实现有关系。在Linux内核中的oom.h文件中,可以看到下面的定义:
?
?
?/* /proc//oom_adj set to -17 protects from the oom-killer */
?
#define OOM_DISABLE (-17)
?
/* inclusive */
?
#define OOM_ADJUST_MIN (-16)
?
#define OOM_ADJUST_MAX 15?
?
这个oom_adj中的变量的范围为15到-16之间。越大越容易被kill。oom_score就是它计算出来的一个值,就是根据这个值来选择哪些进程被kill掉的。
?
总之,通过上面的分析可知,满足下面的条件后,就是启动OOM机制。
?
1) VM里面分配不出更多的page(注意linux kernel是延迟分配page策略,及用到的时候才alloc;所以malloc + memset才有效)。
?
2) 用户地址空间不足,这种情况在32bit机器上及user space超过了3GB,在64bit机器上不太可能发生。
?
具体参见:http://blog.chinaunix.net/uid-20788636-id-4308527.
html
?
其实设置
mysqld的oom_adj不是最好的选择,mysqld不会被kill,必然就会导致其它进程被kill掉;最好还是保障内存充足或者设置vm.swappiness=1比较好
?
4. 内存瓶颈的检测
?
Linux内存的瓶颈,主要在于查看是否有比较严重的 swap 的发生(swap out/page out)。其它空虚内存的大小,swap分区被使用都不能说明说明问题。
?
区分 swap out 和 page out:
?
Page out moves individual pages to swap space on the disk; swapping is a bigger operation that moves the entire address space of a process to swap space in one operation.(page out 是指将单独的page交换到磁盘,而swap out是指将整个进程的内存交换到磁盘)
?
使用 vmstat 从整个
系统层面查看swap out:
?
?
[root@localhost ~]# vmstat 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 400776 55292 82416 0 0 335 103 87 0 6 94 0 0
0 0 0 400768 55292 82416 0 000 54 65 0 2 98 0 0
0 0 0 400768 55292 82416 0 000 69 72 0 3 97 0 0
0 0 0 400644 55300 82416 0 00 18 67 79 0 3 97 0 0
0 0 0 400644 55300 82416 0 000 51 61 0 2 98 0 0
0 0 0 400644 55300 82416 0 000 64 69 0 2 98 0 0
0 0 0 400644 55308 82416 0 00 20 58 73 0 2 98 0 0
?
?
其中的 swap si: 表示每秒 swap in; so:表示每秒swap out;
?
? ?Swap
? si: Amount of memory swapped in from disk (/s).
? so: Amount of memory swapped to disk (/s).
使用 sar -B 从整个系统层面查看page out:
[root@localhost ~]# sar -B
Linux 2.6.32-504.el6.i686 (localhost.localdomain) 10/01/2015 _i686_ (1 CPU)
10:57:33 AM LINUX RESTART
11:00:01 AM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
11:10:01 AM 39.84 4.85 340.32 0.21 39.40 0.00 0.00 0.00 0.00
11:20:01 AM 0.06 2.76 10.69 0.00 3.21 0.00 0.00 0.00 0.00
11:30:01 AM 0.14 2.68 10.16 0.00 3.08 0.00 0.00 0.00 0.00
11:40:01 AM 69.58 13.07 154.16 0.01 47.29 0.00 0.00 0.00 0.00
11:50:01 AM 1.84 3.93 28.39 0.02 9.17 0.00 0.00 0.00 0.00
12:00:01 PM 0.00 3.20 19.70 0.00 10.87 0.00 0.00 0.00 0.00
12:10:01 PM 0.01 2.90 31.96 0.00 8.77 0.00 0.00 0.00 0.00
12:20:01 PM 0.06 3.06 40.04 0.00 10.98 0.00 0.00 0.00 0.00
12:30:02 PM 2.17 3.81 81.19 0.02 21.63 0.00 0.00 0.00 0.00
Average: 12.62 4.47 79.63 0.03 17.15 0.00 0.00 0.00 0.00
03:01:38 PM LINUX RESTART
03:10:01 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgs