作者:何傲

原文来源: https://tidb.net/blog/91cb51aa

【是否原创】是
【首发渠道】TiDB 社区

前言

前不久我们在混合部署架构下测试了TiDB 5.0的性能,测试过程可以参考 TiDB 5.0 异步事务特性体验——基于X86和ARM混合部署架构 。在测试中我们使用了3台X86的TiKV和3台ARM的TiKV,在双方的对比参照下,我发现了一个奇怪的问题,就是相同配置的机器下ARM平台的TiKV Server内存占用量总是比X86平台大,而且不是大了一点点,本文会详细还原这个问题的发现和排查过程,以及如何解决内存异常问题。

发现问题

在部署完TiDB 4.0集群后,我习惯性地打开Dashboard查看各节点的运行状态,在主机页面看到了和往常不一样的画面,一个刚创建完的空集群,有一部分节点内存占用明显偏高,此事必有蹊跷,特别是其中的3台TiKV几乎达到了80%,而另外3台TiKV却处于正常水平:

经过初步判断,超标的3台TiKV刚好都是ARM节点,首先想到的是4.0版本是不是在ARM上有bug,于是把集群升级到5.0后发现问题依旧,说明并不是版本问题。

仔细对比后,发现不仅仅是TiKV节点,其他ARM的TiDB和PD节点内存都比X86的要高,进一步怀疑是TiDB本身对ARM的兼容性问题。为了验证高内存确实由TiDB引起,我以X86节点为参照,开始做一步步排查。

排查问题

以其中一台ARM TiKV为排查对象,首先登录到服务器中查看资源占用情况,直接使用 top 命令:

可以看到,内存占用最高的进程就是TiKV本身无疑,为了不冤枉它,我们还是要对比看看此时X86的情况:

果然和我们预期的一致,面对铁证如山的事实,TiKV背锅背定了。

我们进一步分析此时的节点内存使用情况,使用 cat /proc/meminfo 命令查看:

[root@localhost ~]# cat /proc/meminfo
MemTotal:       32943872 kB
MemFree:         3809408 kB
MemAvailable:    1467264 kB
Buffers:             192 kB
Cached:           457856 kB
SwapCached:       669248 kB
Active:         26691328 kB
Inactive:        2040832 kB
Active(anon):   26565568 kB
Inactive(anon):  1726912 kB
Active(file):     125760 kB
Inactive(file):   313920 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:      16711616 kB
SwapFree:       15044608 kB
Dirty:               256 kB
Writeback:             0 kB
AnonPages:      27385216 kB
Mapped:            75968 kB
Shmem:             18240 kB
KReclaimable:      37120 kB
Slab:             245440 kB
SReclaimable:      37120 kB
SUnreclaim:       208320 kB
KernelStack:       29696 kB
PageTables:        16384 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    33183552 kB
Committed_AS:    1009344 kB
VmallocTotal:   133009506240 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
Percpu:            17408 kB
HardwareCorrupted:     0 kB
AnonHugePages:  18874368 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:     524288 kB
Hugetlb:               0 kB

其中比较诡异的是AnonHugePages字段占到了18G内存,而实际的用户进程空间(Active)也才26G。

继续验证这里的AnonHugePages占用是否都来自TiKV Server进程(PID是3996),用如下命令筛选:

[root@localhost ~]# awk  '/AnonHugePages/ { if($2>4){print FILENAME " " $0; system("ps -fp " gensub(/.*\"/([0-9]+).*/, "\"\"1", "g", FILENAME))}}' /proc/3996/smaps
/proc/3996/smaps AnonHugePages:  10485760 kB
UID        PID  PPID  C STIME TTY          TIME CMD
tidb      3996     1  0 May21 ?        04:40:06 bin/tikv-server --addr 0.0.0.0:20160 --advertise-addr 10.3.65.133:20160 --status-addr 0.0.0.0:20180 --advertise-status-addr 10.3.65.133:20180 --pd 10.3.65.130:2379,10.3.65.131:2
/proc/3996/smaps AnonHugePages:   8388608 kB
UID        PID  PPID  C STIME TTY          TIME CMD
tidb      3996     1  0 May21 ?        04:40:06 bin/tikv-server --addr 0.0.0.0:20160 --advertise-addr 10.3.65.133:20160 --status-addr 0.0.0.0:20180 --advertise-status-addr 10.3.65.133:20180 --pd 10.3.65.130:2379,10.3.65.131:2

从以上信息可以断定所有的AnonHugePages都是来自TiKV进程。

AnonHugePages统计的是透明大页(Transparent HugePages,THP)的使用量,它在RHEL 6以上的版本中是默认开启的。我们都知道操作系统对内存是以页(Page)为使用单位,通常这个大小是4KB,透明大页的设计初衷是尽可能地为应用程序分配大页面(比如2M)来提升性能,减少大内存寻址带来的开销,并且能实现对大页的动态分配和使用。
它对于需要大量内存并对性能敏感的应用程序来说有一些作用,但同时也带来了一个非常严重的问题就是内存泄漏。从RedHat官网的 文档 来看,它不推荐在数据库程序中开启THP:

THP hides much of the complexity in using huge pages from system administrators and developers. As the goal of THP is improving performance, its developers (both from the community and Red Hat) have tested and optimized THP across a wide range of systems, configurations, applications, and workloads. This allows the default settings of THP to improve the performance of most system configurations. However, THP is not recommended for database workloads.

THP支持三种类型的状态,分别是:

  • always,启用状态,系统默认
  • never,禁用状态
  • madvise,应用程序通过MADV_HUGEPAGE标志自己选择

关于透明大页的介绍这里不做过多介绍,大家可以参考文章后面的推荐链接,写的非常详细。

好在RHEL预留了THP的启用开关,我们可以通过如下方式关闭透明大页特性:

# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# echo never > /sys/kernel/mm/transparent_hugepage/defrag

要注意的是,这种方式只是临时禁用,当系统重启后还是会恢复always状态。

通过以上命令关闭了3台ARM TiKV节点的THP后,我重启了TiDB集群:

tiup cluster restart tidb-test

再次登录到Dashboard查看集群中的节点状态,已经全部恢复正常:

整个过程的内存变化情况通过Grafana的监控曲线看的更加明显:\

思考问题

虽然问题已经得到解决,但是仔细思考一下的话里面还有一些疑点没搞明白。

在X86的系统中同样也开启了THP特性,为什么内存使用没有出现明显异常呢?
还有一点就是,ARM的TiDB和PD节点虽然也出现了内存升高,但并不像TiKV节点这样特别明显,这又是什么原因?

我带着疑问去GitHub发起了Issue,不过遗憾的是还没找到问题的根本原因:
https://github.com/tikv/tikv/issues/10203

欢迎各路大佬来一起讨论。

如何避免

其实,因为服务器环境导致可能存在的性能问题TiDB官方已经帮大家考虑到了,并且提供了解决方案,只是这个步骤往往容易被忽略。

从TiDB 4.0版本开始,TiUP的Cluster组件可以提供对部署机器环境检测功能,我们使用 tiup cluster check 命令就可以对部署拓扑文件或者是已有的集群进行监测,效果如下图所示:

我们应该重点关注那些状态为fail的检查项,并且根据后面的提示做相应的调整,这一步对生产环境来说尤其重要。 以本文中的案例来说,tiup提示为了达到最好的性能请禁用THP,当我关闭了系统的THP特性后重新检测TiDB集群,会发现THP这一项已经变为pass状态:

有的人会说这么多检查项一个个去处理太麻烦了,有没有什么快捷的办法。还真有,tiup支持使用 --apply 参数对检测失败的项自动修复,不过也只是支持一部分可通过修改配置或系统参数调整的项目。

tiup cluster check <topology.yml | cluster-name> --apply

最后说一句,TIUP真香啊~

推荐阅读

/PROC/MEMINFO之谜
HUGE PAGES AND TRANSPARENT HUGE PAGES
How to use, monitor, and disable transparent hugepages in Red Hat Enterprise Linux 6 and 7?
CentOS 7 关闭透明大页
使用tiup在x86和arm上混合部署arm内存居高不下
部署机环境检查

在x86和arm混合部署架构下排查TiKV节点内存占用极高的问题相关推荐

  1. linux下的buff/cache内存占用过高-手动清除释放内存

    buff/cache内存占用太高 我们在使用free -h或者(top命令)查看系统内存的时候,有时间会发现buff/cache很高,如下图: [root@nfs ~]# free -htotal u ...

  2. Kubernetes在混合云架构下的应用

    "托管云物理机纳入UK8S集群统一管理后,可实现托管云物理机保障平峰时业务正常运行,高峰时期利用UK8S快速扩容公有云资源的理想应用场景,继而提升混合云的可用性." --海豹他趣技 ...

  3. mysql 安装后大_Window下MySql 5.6 安装后内存占用很高的问题

    Window下MySql 5.6 安装后内存占用很高的问题 刚刚准备玩一把mysql,初学者 环境是window 7和window sever 2008, mysql是最新的5.6, 发现的问题是安装 ...

  4. Elasticsearch——Windows下ES集群部署 Linux下ES单节点、集群部署

    1.开篇 在之前的两篇文章中,说白了就是在windows下部署的ES单节点的环境. 这篇文章主要是说一下windows下部署ES集群.Linux下单节点部署. 单台 Elasticsearch 服务器 ...

  5. Windows下Tomcat内存占用过高问题跟踪(ProcessExplorer+jstack)

    一.问题描述 Tomcat下面部署很多个java项目的war包,tomcat启动一段时间后,发现cpu占用过高,整个界面卡死! 二.通过process explorer查看java进程下的线程 pro ...

  6. kafka tool 查看指定group下topic的堆积数量_ELK架构下利用Kafka Group实现Logstash的高可用...

    系统运维的过程中,每一个细节都值得我们关注 下图为我们的基本日志处理架构 所有日志由Rsyslog或者Filebeat收集,然后传输给Kafka,Logstash作为Consumer消费Kafka里边 ...

  7. linux系统下运行mysql占多大内存_linux 下mysql内存占用过高

    系统是centos,内存只有512M,刚安装好一直不能启动服务,后来修改为 innodb_buffer_pool_size = 10M,便可以启动成功了,但是还是会占400M多,这样本人连启动其他软件 ...

  8. 微服务架构下的可观测性

    微服务架构下的可观测性 一.服务可观测性 传统架构下排查问题 传统项目在出现异常或性能问题时,通常都是基于系统日志文件来排查.而在微服务分布式部署架构下,日志文件随微服务分散存储,对于排查问题工作量很 ...

  9. 华云大咖说 | 混合IT架构的统一管理——安超云套件产品介绍

    在企业模式和业务规模高速迭代的今天,IT设施的横向扩展与纵向协同需求剧增,越来越多的企业为了业务的灵活性与扩展性,都将云化转型作为重要战略部署.但同时,广泛的业务模式势必需要多种IT架构的支撑,企业的 ...

最新文章

  1. Android HAL模块的加载过程
  2. 马斯克:“星链”卫星已能提供服务
  3. 使用TPU的注意事项
  4. return两个返回值_LeetCode 第四题 寻找两个有序数组的中位数
  5. [html] 移动端如何让页面强制横屏显示?
  6. SharePoint 2013 关于自定义显示列表表单的bug
  7. mysql创建数据库与表_PHP MySQL 创建数据库和表 之 Create
  8. html字符串长度函数,最常用的20个javascript方法函数
  9. linux命令行安装qq,在Linux上使用mojoqq来实现命令行QQ
  10. 阿尔泰USB5630数据采集卡
  11. ELK基于ElastAlert实现日志的微信报警
  12. 64位计算机安装32位,告诉你64位电脑怎么装32位系统
  13. 如何设置普通网页的微信分享图标
  14. 保护眼睛的颜色和各种背景颜色设置方法
  15. MetLife - 美国大都会人寿保险公司
  16. JS计算字符串在浏览器中显示的宽度
  17. 51nod1503 猪和回文
  18. 【08月01日】A股滚动市净率PB历史新低排名
  19. linux之文件搜索和文件内容搜索
  20. 大家一起学习用VBA查询数据

热门文章

  1. Echarts实现图表下钻
  2. matlab在有限差分法中的应用,MATLAB在有限差分法数值计算中的应用
  3. 阿里云服务器+微信公众号配置(Token验证不通过)
  4. 计算机应用专业顶岗实习计划,计算机学生顶岗实习计划(网络版)
  5. 优傲优化福特汽车装配线生产效率
  6. Android层面上对sensor及event事件的处理
  7. 烽火十八台丨从3.15曝光的食品安全问题看供应链网络安全防护
  8. php中上传图片的大小,php如何修改上传图片大小
  9. java计算机毕业设计智友少儿编程学习平台源码+mysql数据库+系统+部署+lw文档
  10. 循环-05. 兔子繁衍问题