正在加载...
分页: 5/13 第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]

Mysql对large page的支持

[ 2010/01/25 11:16 | by selboo ]
    在 Linux 操作系统上运行内存需求量较大的应用程序时,由于其采用的默认页面大小为 4KB,因而将会产生较多 TLB Miss 和缺页中断,从而大大影响应用程序的性能。当操作系统以 2MB 甚至更大作为分页的单位时,将会大大减少 TLB Miss 和缺页中断的数量,显著提高应用程序的性能。这也正是 Linux 内核引入大页面支持的直接原因。好处是很明显的,假设应用程序需要 2MB 的内存,如果操作系统以 4KB 作为分页的单位,则需要 512 个页面,进而在 TLB 中需要 512 个表项,同时也需要 512 个页表项,操作系统需要经历至少 512 次 TLB Miss 和 512 次缺页中断才能将 2MB 应用程序空间全部映射到物理内存;然而,当操作系统采用 2MB 作为分页的基本单位时,只需要一次 TLB Miss 和一次缺页中断,就可以为 2MB 的应用程序空间建立虚实映射,并在运行过程中无需再经历 TLB Miss 和缺页中断(假设未发生 TLB 项替换和 Swap)。
为了能以最小的代价实现大页面支持,Linux 操作系统采用了基于 hugetlbfs 特殊文件系统 2M 字节大页面支持。这种采用特殊文件系统形式支持大页面的方式,使得应用程序可以根据需要灵活地选择虚存页面大小,而不会被强制使用 2MB 大页面。

在mysql中,innodb可以使用large pages来分配buffer pool跟additional memory pool.
下面来看下mysql使用large pages具体的实现方法

1:查看系统是否支持huge-pages
cat /proc/meminfo | grep -i huge
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugepagesize有值,说明系统支持large pages(如不支持,系统需要重新编译来支持)

2:配置
把配置写入到/etc/sysctl.conf 然后sysctl -p使其生效
vm.nr_hugepages=200 (大页面的页数)
vm.hugetlb_shm_group=1001(需要使用大页面的用户id 可用id mysql 来查看mysql的ID)
kernel.shmmax=536887296
#kernel.shmall=524288

3:如需使mysql使用large pages,还需设置max locked-in-memory的大小
用ulimit -a(或者ulimit -l)来查看 max locked memory       (kbytes, -l) 32
vim /etc/security/limits.conf
mysql            soft    memlock      3145728
mysql            hard    memlock      3145728
或者用ulimit -l 3145728来设置,

4:vim /etc/mysql/my.cnf
添加large-pages,使得mysql 支持large-pages

5:启动mysql。
在启动mysql的时候,最容易报的错误是:
InnoDB: HugeTLB: Warning: Failed to allocate 138412032 bytes. errno 12
InnoDB HugeTLB: Warning: Using conventional memory pool
这是由于上面配置的两点所致。
1)nr_hugepages 的值*2M应大于(innodb_buffer_pool_size+innodb_additional_mem_pool_size)因为以上谈到innodb可以使用large pages来分配buffer pool跟additional memory pool.
2)memlock 的设置,在启动mysql时,一定要先查看用ulimit -a 来查看max locked memory 设置是否合理,可以尝试用以上两种方法来设置该值。还有一点,/etc/security/limits.conf配置文件的修改,可能无法通过ssh来查看,故也不能用ssh来启动mysql。
Tags:
     作者:吴炳锡 来源:http://www.mysqlsupport.cn/ 联系方式: wubingxi#gmail.com

         我们知道Innodb的数据页是16K,而且是一个硬性的规定,系统里没更改的办法,希望将来MySQL也能也Oracle一样支持多种数据页的大小。
但实际应用中有时16K显的有点大了,特别是很多业务在Oracle或是SQL SERVER运行的挺好的情况下迁到了MySQL上发现IO增长太明显的情况下,
就会想到更改数据页大小了。
  实际上innodb的数据页大小也是可以更改的,只是需要在源码层去更改,然后重新rebuild一下MySQL.
    更改办法:
    (以MySQL-5.1.38源码为例)
    位置在storage/innobase/include/univ.i ,在univ.i中查找:UNIV_PAGE_SIZE

/*
   DATABASE VERSION CONTROL
   ========================
*/

/* The universal page size of the database */
#define UNIV_PAGE_SIZE          (2 * 8192) /* NOTE! Currently, this has to be a
     power of 2 */
/* The 2-logarithm of UNIV_PAGE_SIZE: */
#define UNIV_PAGE_SIZE_SHIFT 14

/* Maximum number of parallel threads in a parallelized operation */
#define UNIV_MAX_PARALLELISM 32


   UNIV_PAGE_SIZE就是数据页大小,默认的是16K. 后面的备注里标明,该值是可以设置必须为2的次方。对于该值可以设置成4k,8k,16k,32K,64K,在大也没意义了。
同时更改了UNIV_PAGE_SIZE后需要更改 UNIV_PAGE_SIZE_SHIFT 该值是2的多少次方为UNIV_PAGE_SIZE,所以设置数据页分别情况如下:

#define UNIV_PAGE_SIZE_SHIFT 12  if UNIV_PAGE_SIZ=4K
#define UNIV_PAGE_SIZE_SHIFT 13  if UNIV_PAGE_SIZ=8K
#define UNIV_PAGE_SIZE_SHIFT 15  if UNIV_PAGE_SIZ=32K


例子:
 更改innodb的数据页为8K,相应修改为:

/*
   DATABASE VERSION CONTROL
   ========================
*/

/* The universal page size of the database */
#define UNIV_PAGE_SIZE          8192   /* NOTE! Currently, this has to be a
     power of 2 */
/* The 2-logarithm of UNIV_PAGE_SIZE: */
#define UNIV_PAGE_SIZE_SHIFT 13

/* Maximum number of parallel threads in a parallelized operation */
#define UNIV_MAX_PARALLELISM 32


重新编译,然后测试测试,再测试。Good luck!
=====================================
mysql.5.0.88 在 innobase/include/univ.i

测试插入2000W 条数据的

修改前
    1.   Query OK, 1 row affected (23 min 41.56 sec)
    2.   Query OK, 1 row affected (23 min 52.65 sec)

修改后
    3.   Query OK, 1 row affected (14 min 14.90 sec)
    4.   Query OK, 1 row affected (14 min 23.79 sec)
Tags: ,

mysql的show status 解释

[ 2009/12/09 12:13 | by selboo ]
Aborted_clients  由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。
Aborted_connects  尝试已经失败的MySQL伺
Tags: ,

Mysql mysqlreport

[ 2009/11/29 11:47 | by selboo ]
要掌握数据库状态,并了解其不足,然后作出一份详细可靠的优化方案,必须对数据库的各个参数进行量化的了解比如cache用了多,数据每秒有多少请求,select与insert的比例各占多少等。对mysql而言最简单的方案是直接show status,不过这些数据十分晦涩枯燥,不容易理解。mysqlreport的报表则易懂得多.
mysqlreport提供了几乎所有的mysql的关键status信息,而且对这些数据做了加工处理理解起来十分的方便。
参考文档:

1.http://hackmysql.com/mysqlreportguide
2.http://hi.baidu.com/xuwanbest/blog/item/f3f8fca1df8e2788461064fe.html

只有亲试之,才会体会其中的妙处

部分结果:
Tags:
      在MySQL中,数据库对应数据目录中的目录。数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,取决于存储引擎)。因此,所使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。这说明在大多数Unix中数据库名和表名对大小写敏感,而在Windows中对大小写不敏感。一个显著的例外情况是Mac OS X,它基于Unix但使用默认文件系统类型(HFS+),对大小写不敏感。

在windows下表名不区分大小写,所以在导入数据后,有可能所有表名均为小写;

而从win导入linux后,在调用时会出现大小写的问题,则有些表,例如:

第一点:程序调用表名为:fov_Web;

第二点:导入win后变为fov_web;

第三点:再导入linux后也是fov_web,此时linux会区分表名的大小写,则导致该表无法读取。

解决方法:======================================

在linux下mysql表名大小写问题解决方法:

修改my.cnf,一般位于:/etc/my.cnf

[mysqld]
lower_case_table_names=1
#表名全部为小写,避免出现大小写敏感

分页: 5/13 第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]