numa 架构下mysql可能遭遇的swap问题
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,相对于SMP(又称uniform. memory architecture),NUMA引入了node的概念,每个物理CPU都被视作一个node,而每个node都有一个local memory(访问速度
千家信息网最后更新 2025年12月02日numa 架构下mysql可能遭遇的swap问题
相对于SMP(又称uniform. memory architecture),NUMA引入了node的概念,每个物理CPU都被视作一个node,而每个node都有一个local memory(访问速度更快),其他node的内存则为remote;
NUMA相关的策略1、每个进程(或线程)都会从父进程继承NUMA策略,并分配有一个优先node。如果NUMA策略允许的话,进程可以调用其他node上的资源。2、NUMA的CPU分配策略有cpunodebind、physcpubind。cpunodebind规定进程运行在某几个node之上,而physcpubind可以更加精细地规定运行在哪些核上。3、NUMA的内存分配策略有localalloc、preferred、membind、interleave。localalloc规定进程从当前node上请求分配内存;而preferred比较宽松地指定了一个推荐的node来获取内存,如果被推荐的node上没有足够内存,进程可以尝试别的node。membind可以指定若干个node,进程只能从这些指定的node上请求分配内存。interleave规定进程从指定的若干个node上以Round-roll算法交织地请求分配内存。
在现有的Redhat Linux中,localalloc是默认的NUMA内存分配策略,这个配置选项导致资源独占程序很容易将某个node的内存用尽。而当某个node的内存耗尽时,Linux又刚好将这个node分配给了某个需要消耗大量内存的进程(或线程),此时即便其他node有空闲内存也无济于事,于是就产生了swap
可通过numactl查看相关信息numactl --hardware查看# numactl --hardwareavailable: 2 nodes (0-1)node 0 size: 32276 MBnode 0 free: 26856 MBnode 1 size: 32320 MBnode 1 free: 26897 MBnode distances:node 0 1 0: 10 21 1: 21 10
通过/proc/pid/numa-maps可以查看分配给mysqld的numa信息--读取numa-maps会阻塞相应进程,因此不宜频繁调用 2aaaaad3e000 default anon=13240527 dirty=13223315 swapcache=3440324 active=13202235 N0=7865429 N1=5375098
可通过perl脚本格式化输出N0 : 7983584 ( 30.45 GB)N1 : 5440464 ( 20.75 GB)active : 13406601 ( 51.14 GB)anon : 13422697 ( 51.20 GB)dirty : 13407242 ( 51.14 GB)mapmax : 977 ( 0.00 GB)mapped : 1377 ( 0.01 GB)swapcache : 3619780 ( 13.81 GB)
Node 0/1各分配32G,但是 node 0已经使用了30多G,所剩无几;如果继续在node 0请求内存,则需swap,即便此时node 1还有10G空余;解决方法:使用interleave,轮询各个node分配内存修改mysqld_safe,在cmd="$NOHUP_NICENESS"后添加如下信息cmd="/usr/bin/numactl --interleave all $cmd"此时NUMA内存分配情况N0 : 6814756 ( 26.00 GB)N1 : 6816444 ( 26.00 GB)anon : 13629853 ( 51.99 GB)dirty : 13629853 ( 51.99 GB)mapmax : 296 ( 0.00 GB)mapped : 1384 ( 0.01 GB)
twitter生产库144G内存,innodb buffer pool占用120G;除了采用numactl --interleave=all在启动mysqld前调用sysctl -q -w vm.drop_caches=3清空缓存并且启动mysqld立即分配innodb buffer pool
注:也可在BIOS层面将NUMA改为SUMA,在底层将所有分配策略都设为interleave,但粒度太大不利于分化;默认innodb buffer pool采用lazy-allocation,可采用--innodb-buffer-pool-populate立即分配,通过使用mmap的MAP_POPULATE位实现;
参考资料http://blog.wl0.org/2012/09/checking-procnuma_maps-can-be-dangerous-for-mysql-client-connections/ http://blog.jcole.us/2010/09/28/mysql-swap-insanity-and-the-numa-architecture/ http://www.realzyy.com/?p=1245#more-1245 http://kevinclosson.wordpress.com/2009/05/14/you-buy-a-numa-system-oracle-says-disable-numa-what-gives-part-ii/
相对于SMP(又称uniform. memory architecture),NUMA引入了node的概念,每个物理CPU都被视作一个node,而每个node都有一个local memory(访问速度更快),其他node的内存则为remote;
NUMA相关的策略1、每个进程(或线程)都会从父进程继承NUMA策略,并分配有一个优先node。如果NUMA策略允许的话,进程可以调用其他node上的资源。2、NUMA的CPU分配策略有cpunodebind、physcpubind。cpunodebind规定进程运行在某几个node之上,而physcpubind可以更加精细地规定运行在哪些核上。3、NUMA的内存分配策略有localalloc、preferred、membind、interleave。localalloc规定进程从当前node上请求分配内存;而preferred比较宽松地指定了一个推荐的node来获取内存,如果被推荐的node上没有足够内存,进程可以尝试别的node。membind可以指定若干个node,进程只能从这些指定的node上请求分配内存。interleave规定进程从指定的若干个node上以Round-roll算法交织地请求分配内存。
在现有的Redhat Linux中,localalloc是默认的NUMA内存分配策略,这个配置选项导致资源独占程序很容易将某个node的内存用尽。而当某个node的内存耗尽时,Linux又刚好将这个node分配给了某个需要消耗大量内存的进程(或线程),此时即便其他node有空闲内存也无济于事,于是就产生了swap
可通过numactl查看相关信息numactl --hardware查看# numactl --hardwareavailable: 2 nodes (0-1)node 0 size: 32276 MBnode 0 free: 26856 MBnode 1 size: 32320 MBnode 1 free: 26897 MBnode distances:node 0 1 0: 10 21 1: 21 10
通过/proc/pid/numa-maps可以查看分配给mysqld的numa信息--读取numa-maps会阻塞相应进程,因此不宜频繁调用 2aaaaad3e000 default anon=13240527 dirty=13223315 swapcache=3440324 active=13202235 N0=7865429 N1=5375098
可通过perl脚本格式化输出N0 : 7983584 ( 30.45 GB)N1 : 5440464 ( 20.75 GB)active : 13406601 ( 51.14 GB)anon : 13422697 ( 51.20 GB)dirty : 13407242 ( 51.14 GB)mapmax : 977 ( 0.00 GB)mapped : 1377 ( 0.01 GB)swapcache : 3619780 ( 13.81 GB)
Node 0/1各分配32G,但是 node 0已经使用了30多G,所剩无几;如果继续在node 0请求内存,则需swap,即便此时node 1还有10G空余;解决方法:使用interleave,轮询各个node分配内存修改mysqld_safe,在cmd="$NOHUP_NICENESS"后添加如下信息cmd="/usr/bin/numactl --interleave all $cmd"此时NUMA内存分配情况N0 : 6814756 ( 26.00 GB)N1 : 6816444 ( 26.00 GB)anon : 13629853 ( 51.99 GB)dirty : 13629853 ( 51.99 GB)mapmax : 296 ( 0.00 GB)mapped : 1384 ( 0.01 GB)
twitter生产库144G内存,innodb buffer pool占用120G;除了采用numactl --interleave=all在启动mysqld前调用sysctl -q -w vm.drop_caches=3清空缓存并且启动mysqld立即分配innodb buffer pool
注:也可在BIOS层面将NUMA改为SUMA,在底层将所有分配策略都设为interleave,但粒度太大不利于分化;默认innodb buffer pool采用lazy-allocation,可采用--innodb-buffer-pool-populate立即分配,通过使用mmap的MAP_POPULATE位实现;
参考资料http://blog.wl0.org/2012/09/checking-procnuma_maps-can-be-dangerous-for-mysql-client-connections/ http://blog.jcole.us/2010/09/28/mysql-swap-insanity-and-the-numa-architecture/ http://www.realzyy.com/?p=1245#more-1245 http://kevinclosson.wordpress.com/2009/05/14/you-buy-a-numa-system-oracle-says-disable-numa-what-gives-part-ii/
内存
分配
进程
策略
信息
线程
资源
可通
推荐
运行
宽松
频繁
所剩无几
无济于事
参考资料
又称
可在
层面
底层
情况
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
上海个性化软件开发批发价格
附加数据库 代码
网络技术有什么社会实践活动
数据库max最大值
oa的服务器地址在哪里找
学生成绩数据库sql设计
网络安全相关的法律和标准
技术分享数据库
网络安全生产宣传日
联想服务器上架
快连服务器不在线
采集局域网mysql数据库
现在网络技术的发展
数据库的引用和复制
铁路系统网络安全红线
鹤壁网络技术质量
南京知一点网络技术
厦门网络安全教育平台作业
网络安全成果实物印刷
网络安全威胁和风险突出的表现
文件服务器价格
网络安全保密管理员主要负责
互联网 科技创新
分布式数据库 大数据
vc2010与数据库
sql修改数据库表字段
ic卡加油系统 软件开发
判断数据库连接状态
网络安全事件的处理流程
清水河服务器机柜加工厂