设为首页 加入收藏

TOP

MySQL内存分配(三)
2014-11-24 03:13:17 来源: 作者: 【 】 浏览:4
Tags:MySQL 内存 分配
B. (TLB =Translation Lookaside Buffer,旁路转换缓冲.) TLB是硬件实现的内存关联查找表; 将64位的虚拟地址转换到实际的物理地址.

因为TLB是一个小的,虚拟寻址的缓存,有时会发生 “misses”(未命中),那就会进入物理RAM来查找. 这是两次查找是很费时的操作,所以应该避免.

通常,内存被 “分页” 为 4 KB一页,TLB实际上将高位的(64 - 12)位映射到一个特定页面. 而低12位通过虚地址转换得到完整的地址.

例如,128 GB的RAM按 4 KB分页需要 32M(3200万个) page-table条目. 这太大了, 远远超过TLB的容量. 所以陷入了“Huge page”的骗局.

随着硬件与操作系统的支持,使部分RAM成为巨型页面成为可能 ,比如说4 MB(而不是4 KB). 这使得TLB条目剧减,对这部分RAM来说分页单元是4 MB. 因此,巨大的页面相当于是不分页的(non-pagable).

现在内存被分为 pagable 和 non pagable 两部分; 哪些部分 non pagable 是合理的 在MySQL中, innodb_buffer_pool 就是一个完美的使用者. 通过正确地配置这些,InnoDB能跑得更快一点:

启用 Huge pages通知操作系统分配适当的数量(和 buffer_pool 个数一致) 通知MySQL使用huge pages innodb memory usage vs swap 该帖包含有很多需要关注点以及如何设置的细节.
整体性能收益:几个百分点. Yawn.

MEMORY引擎(ENGINE=MEMORY)

这是一个不常用的存储引擎,算是MyISAM和InnoDB的替代品. 其数据不是持久的,所以其应用范围相当有限. 内存表的大小受限于 max_heap_table_size ,默认值是16 MB. 我提起它,以防你将此值修改得太大;这会偷偷地占用可用的RAM.

如何设置变量(VARIABLEs)

在文本文件my.cnf中(Windows上是my.ini),添加一行,例如

innodb_buffer_pool_size = 5G

即: 变量名,等号“=”,变量的值. 有些值允许缩写,如M代表 million(1048576),G代表billion.

要让服务器看到这些设置,必须将其放到配置文件的 “[mysqld]”节下.

对 my.cnf 或 my.ini的设置不会立即生效,需要你重启服务器.

大多数的设置可以通过 root 账号登陆后在线修改 (其他 SUPER权限账号也可以),例如:

SET @@global.key_buffer_size = 77000000;

注意:此处不允许设置 M 或 G 等单位.

查看全局变量的设置信息:

mysql> SHOW GLOBAL VARIABLES LIKE "key_buffer_size";
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| key_buffer_size | 76996608 |

+-----------------+----------+注意,这部分设置MySQL会向下取整,对齐到一定的数字.

你可能需要修改两个地方(执行SET 并修改my.cnf),以使修改立即生效,并且下次重启后依然是同样的值(不管是手动,还是其他原因重新启动)

Web服务器

像Apache这样的web服务器使用多线程来处理. 如果每个线程打开一个 MySQL连接,可能会超过允许的最大连接数. 确保将web服务器的 MaxClients (或类似参数) 设置为一个合理的值(如50以下).

工具

MySQLTuner

TUNING-PRIMER

上面是几个对内存设置建议的工具. 其中有一个误导性条目:

Maximum possible memory usage: 31.3G (266% of installed RAM)

可能使用的内存最大值为: 31.3G (可能是物理内存的 266%)

不要让它吓到你,这些工具使用的公式过于保守了. 他们假设所有 max_connections 都在使用并且处于活跃状态,并正在执行一些内存密集型的工作.

Total fragmented tables: 23

有碎片的tables: 23 个

这意味着 OPTIMIZE TABLE 可能会有作用. 我建议对表设置高百分比的 “free space”(见SHOW TABLE STATUS) 或者你知道对什么表做了大量的删除/更新操作. 不过,不必费心频繁地对table进行OPTIMIZE 优化整理. 一个月一次可能就够了.

文章修改记录

2010创建;2012年10月更新,2014年1月更新;

更深入的文章:

MySQL 5.6的调优

InnoDB性能优化的基本知识(终极版)

MySQL安装后的10项优化设置

通过 MySQL论坛::性能 联系作者 ——里克·詹姆斯

里克·詹姆斯的MySQL相关文档

提示,调试、howto、优化相关等等……
Rick's RoTs (Rules of Thumb -- lots of tips)
Memory Allocation (caching, etc)
Character Set and Collation problem solver
Converting from MyISAM to InnoDB -- includes differences between them
Big DELETEs - how to optimize
Compound INDEXes plus other insights into the mysteries of INDEXing
Partition Maintenance (DROP+REORG) for time series
Entity-Attribute-Value -- a common, poorly performing, design patter; plus an alternative
Find the nearest 10 pizza parlors (efficient searching on Latitude + Longitude)
Alter of a Huge table
Latest 10 news articles -- how to optimize the schema and code for such
Pagination, not with OFFSET, LIMIT
Data Warehouse techniques (esp., Summary Tables)
Techniques on efficiently finding a random row (On beyond ORDER BY RAND())
GUID/UUID Performance (type 1 only)
IP Range Table Performance
MySQL Limits
Galera Limitations (with Percona XtraDB Cluster / MariaDB)
Rollup Unique User Counts
Best of MySQL Forum

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hadoop的thriftserver配置 下一篇利用Java针对MySql封装的jdbc框架..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·如何在 C 语言中管理 (2025-12-25 03:20:14)
·C语言和内存管理有什 (2025-12-25 03:20:11)
·为什么C语言从不被淘 (2025-12-25 03:20:08)
·常用meta整理 | 菜鸟 (2025-12-25 01:21:52)
·SQL HAVING 子句:深 (2025-12-25 01:21:47)