社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

MySQL基于linux的内存分析

老叶茶馆 • 5 年前 • 495 次点击  


导读:

作者:知数堂学员-邓志航;MySQL DBA,天生的MySQL爱好者,热衷于为他人解决问题,善于总结和分享。对数据平台构建和排查疑难问题有非常浓厚的兴趣



一、简介: 
MySQL基于linux的内存分析


二、关键指标定义
1、底层分配和释放内存

2、使用C标准库的malloc()或者mmap(),就可以在堆和文件映射段分配内存了,通过free()或者ummap()进行释放

3、top关注进程

  • virt是虚拟内存占用量,即便没有使用,只要申请过,就会算进去,mysql申请的virt memory是不会释放的
  • res 是实际占用内存,但是不包含共享内存和swap占用
  • share 是共享内存大小
  • mem% 是进程占用物理内存的百分比 
注意:通常情况下虚拟内存的占用会远远大于真实内存,但是如果相等,就表明申请的全部用到
4、free -m
  • Buffer(缓冲区) 是对磁盘数据的缓存,用来合并多次小写成为一次大写
  • Cache(缓存) 是文件数据的缓存,用来进行文件的读写,数据库针对cache的使用率非常高,因为都是从文件读取数据到内存的


三、MySQL层

1、全局级别 innodb_buffer_pool,innodb_log_buffer_size

2、会话级别 session

  • 查询相关变量  sort_buffer_size,join_buffer_size,tmp_table_size等

  • 事务相关变量  binlog_cache_size

  • 会话相关变量  thread_stack


四、常见问题场景

  • 场景1 
    描述 linux使用了全部内存,并且占用了swap空间,甚至导致了oom-killer
  • 场景2
    描述 linux使用了还有大量剩余内存,但是却使用了swap空间 
  • 场景3
    描述 linux使用了全部内存,并且占用了swap空间,但是与场景1不同点在于,mysql的innodb_buffer_pool设置的非常少.但是通过top却发现大量的内存被mysql申请占用


五、通用解决方式

1、加大内存,innodb_buffer_pool,拆分数据库 应对场景1(内存使用不足)
2、可能是由于numa导致的解决方式有以下几种,应对场景2(由于numa问题导致)
  • mysql配置文件添加 innodb_numa_interleave=on
  • mysql启动时候添加 numactl --interleave=all  参数

  • Linux Kernel启动参数中加上numa=off
3、进行问题排查
  • pmap -d 看一下进程的内存情况,发现anoa的量很大(anoa代表进程主动申请内存)
  • 打开mysql关于内存使用的统计 
update performance_schema.setup_instruments set enabled = 'yes' where name like 'memory%'
  • 应该是由于thread导致的,所以根据thread进行分析具体占用(5.7),具体语句:


定位具体thread_id
select thread_id,event_name, SUM_NUMBER_OF_BYTES_ALLOC from memory_summary_by_thread_by_event_name order by SUM_NUMBER_OF_BYTES_ALLOC desc limit 20;
定位具体线程
select * from threads where thread_id=thread
4、进行线程的具体分析

六、总结

内存问题一般深入都比较复杂,有些方面需要分析线程源码,希望借此为大家分析问题提供一个思路


END





扫码加入QQ技术交流群

(群号:793818397)

   


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/45190
 
495 次点击