一 简介:linux内存和mysql

二 分类

1 用户空间和内核空间

用户空间内存,从低到高分别是五种不同的内存段

1 只读段 包含代码和常量等

2 数据段 包含全局变量等

3 堆,包含动态分配的内存,从低地址开始增长

4 文件映射段,包括动态库,共享内存等,从高地址开始向下增长

5 栈,包括局部变量和函数调用的上下文切换等,栈的大小一般是8MB

2 分配内存

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

3 回收内存空间的方式

注意 下面进行回收的内存都是被标记为已使用的

1 回收缓存 LRU淘汰不常使用的缓存页

2 回收不常访问的内存.把不常用的内存通过交换分区直接写到磁盘中

3 杀死进程 OOM-KILLER

4 top关注进程

virt是虚拟内存占用量,即便没有使用,只要申请过,就会算进去

res 是实际占用内存,但是不包含共享内存和swap占用

share 是共享内存大小

mem% 是进程占用物理内存的百分比

注意 通常情况下虚拟内存的占用会远远大于真实内存,但是如果相等,就标明申请的全部用到

5 free -m

1 Buffer(缓冲区) 是对磁盘数据的缓存,用来合并多次小写成为一次大写

2 Cache(缓存) 是文件数据的缓存,用来进行文件的读写

数据库针对cache的使用率非常高,因为都是从文件读取数据到内存的

三 mysql层

1 innodb_buffer_pool定义(主要)

2 session占用(次要)

3 table cache相关的内存(次要)

4 tmp/memory 引擎表占用(次要)

四 分析方法

一 linux角度

工具:pmap是linux系统自带的一款内存分析工具

用法: pmap -d pid

说明

-x extended Show the extended format. 显示扩展格式

-d device Show the device format. 显示设备格式

输出结果解析:

1 mapped 和writeable/private 能够反映内存的变化.

mapped 表示该进程映射的虚拟地址空间大小,也就是该进程预先分配的虚拟内存大小,即ps出的vsz

writeable/private 表示进程所占用的私有地址空间大小,也就是该进程实际使用的内存大小

shared 表示进程和其他进程共享的内存大小

工具: valgrind

用法: ./valgrind --tool=memcheck --leak-check=yes --show-reachable=yes program

可以确定是否有内存泄漏

二 mysql角度

版本:mysql5.7+

分析 1 根据 performance_schema 可以分析 现主要的占用内存,比如innodb_buffer_pool,session等

2 查看mysql innodb_buffer_pool的命中率