damn mouse
Tuesday, December 28th, 2010上周五,Lina在桌上放了一盘香肠。星期天我们回家的时候,好几个香肠被翻到盘子外面去了。Lina惊呼有老鼠,我还不相信。
结果第二天早上,我还眯着呢,突然听见厨房一身惨叫,Lina跑进房间里说有只老鼠在灶台上奔跑……
送她出门之后,我仔细看了一下。这只可恶的老鼠居然在我们的餐桌上拉屎,还咬坏了我买的铁丝球。
昨天晚上回家的路上,买了个粘鼠板放在冰箱旁边。没想到今天回家,发现粘鼠板被老鼠咬得面目全非。它还很聪明地把咬下来的粘鼠板铺到有粘性的一面上,造了一条路出来。崩溃,又去买了四个粘鼠板,在冰箱旁边围了一圈。
小样,不信抓不到你!
重大update:
老鼠已经抓到,我把它扔到屋外去了。
MySQL如何避免使用swap(二)
Thursday, December 23rd, 2010之前介绍了MySQL如何避免使用swap的四个方法。这里需要补充一下原理和实现机制,对于Linux api不感兴趣的同学可以直接跳过。
一、操作系统设置swap的目的
程序运行的一个必要条件就是足够的内存,而内存往往是系统里面比较紧张的一种资源。为了满足更多程序的要求,操作系统虚拟了一部分内存地址,并将之映射到swap上。对于程序来说,它只知道操作系统给自己分配了内存地址,但并不清楚这些内存地址到底映射到物理内存还是swap。
物理内存和swap在功能上是一样的,只是因为物理存储元件的不同(内存和磁盘),性能上有很大的差别。操作系统会根据程序使用内存的特点进行换入和换出,尽可能地把物理内存留给最需要它的程序。但是这种调度是按照预先设定的某种规则的,并不能完全符合程序的需要。一些特殊的程序(比如MySQL)希望自己的数据永远寄存在物理内存里,以便提供更高的性能。于是操作系统就设置了几个api,以便为调用者提供“特殊服务”。
二、Linux提供的几个api
1、mlockall()和munlockall()
这一对函数,可以让调用者的地址空间常驻物理内存,也可以在需要的时候将此特权取消。mlockall()的flag位可以是MCL_CURRENT和MCL_FUTURE的任意组合,分别代表了“保持已分配的地址空间常驻物理内存”和“保持未来分配的地址空间常驻物理内存”。对于Linux来说,这对函数是非常霸道的,只有root用户才有权限调用。
2、shmget()和shmat()
这一对函数,可以向操作系统申请使用大页内存(Large Page)。大页内存的特点是预分配和永驻物理内存,因为使用了共享内存段的方式,page table有可能会比传统的小页分配方式更小。对于多进程共享内存的程序(比如ORACLE),大页内存能够节省很多page table开销;而对于MySQL来说,性能和资源开销都没有显著变化,好处就在于减少了内存地址被映射到swap上的可能。至于为什么是减少,而不是完全避免,之后再讲解。
(more…)
MySQL如何避免使用swap
Thursday, December 23rd, 2010Linux有很多很好的内存、IO调度机制,但是并不会适用于所有场景。对于DBA来说Linux比较让人头疼的一个地方是,它不会因为MySQL很重要就避免将分配给MySQL的地址空间映射到swap上。对于频繁进行读写操作的系统而言,数据看似在内存而实际上在磁盘是非常糟糕的,响应时间的增长很可能直接拖垮整个系统。这篇blog主要讲讲我们作为DBA,怎样尽量避免MySQL惨遭swap的毒手。
(more…)