高并发下MySQL数据库的优化.ppt

高负载下MySQL数据库的优化 金凯声 2009-12-24 优化重点 运维角度优化 硬件优化 升级硬件 优化硬件驱动配置 Mysql优化 配置优化 编译参数优化 部署方案优化 系统及应用级优化更有效 高负载判断 硬件相关 服务器系统Load超过经验阀值(top) 查看磁盘IO,繁忙引发cpu高占用(iostat ) 查看服务器连接数超过预设值 (netstat) 数据库自身指标 并发数 (mysqladmin status) 慢查询数(同上) 硬件之间的相互影响 服务器之磁盘相关 磁盘IO 读写压力 如:社区类增,删,改操作频繁 读写分离 调整磁盘子系统参数(提高读写频率) /proc/sys/vm/dirty_ratio /proc/sys/vm/dirty_background_ratio /proc/sys/vm/dirty_writeback_centisecs /proc/sys/vm/dirty_expire_centisecs(5秒-2秒) 修改文件系统(ext3-XFS) 服务器之磁盘 修改文件系统( 巨大反差) 服务器之内存、cpu 内存成为系统高负载原因 内存耗尽 Mysql占用swap分区 服务器其他程序挤占内存 Cpu成为高负载瓶颈原因 慢查询 频繁的锁表操作 MySQL配置优化之连接数 连接数过多处理办法 提高mysql连接数阀值 降低前台与DB的连接次数 减少慢查询数,提高响应时间 减少或合并锁表操作,提高响应时间 分表分库 分服务器 主从结构,集群。。。 Mysql之配置优化 中心工作调节各种类型缓存大小 缓存过小,会降低命中,导致直接表操作增加,影响性能。 缓存过多,增加内存开销 缓存类型 读、写、索引、查询、排序、临时表、关键字等待。。。 真实的并发处理数 thread_concurrency = 8 服务器cpu内核数 各种缓存大小 key_buffer = 384M 索引块缓存 max_allowed_packet = 1M table_cache = 2048 所有线程打开表的数量 sort_buffer_size = 2M 对排列缓存 read_buffer_size = 2M 读缓存 read_rnd_buffer_size = 8M 随即读排序缓存 myisam_sort_buffer_size = 64M 排序MyISAM索引分配的缓冲区 thread_cache_size = 8 可以复用的保存在缓存中的线程的数量 query_cache_size = 32M 查询缓存 tmp_table_size = 256M 临时表大小 max_heap_table_size = 256M 内存表大小 延时等待 interactive_timeout=2880000 对后续起的交互链接有效; wait_timeout=2880000 对当前交互链接有效; 连接数 max_connections= 3000 最大并发数 max_connect_errors = 6000 back_log=500 堆栈队列大小 域名相关 skip-name-resolve 跳过反响解析 结束语 一般系统级优化到有限的 优化目的是发挥硬件潜能 但受硬件限制 或受到操作系统内核限制 应用级优化才是真正的王道 通过select语句优化 通过调整业务策略较少连接数 或分解慢查询,提高执行效率 包括分解逻辑降低DB使用率等待 这些都可以从根本上解决DB高并发问。 * 一般不会出问题,因为网卡流量跑满前其他硬件已经无法支持了 网卡 系统变慢或崩溃,load升高 大量的临时表空间占用 cpu高 占用swap分区 内存 系统变慢,load升高 慢查询,跨表统计等 无 使用率高 cpu load高 频繁读写 cpu高 使用率高 磁盘I/O 导致结果 原因 受影响硬件 状态   * * *