首页 > 数据库 >KingbaseES 数据库无响应问题分析

KingbaseES 数据库无响应问题分析

时间:2024-07-26 11:09:01浏览次数:18  
标签:20 操作系统 数据库 响应 内存 进程 磁盘 KingbaseES 页面

一、背景及理论阐述

某项目数据库系统是集群环境,主库业务卡顿,应用反馈部分业务无法正常进行。
在操作系统中,物理内存(RAM)是有限的资源,当内存需求超过物理内存的容量时,操作系统会使用页面调度机制来管理内存资源。页面调度涉及将不常用的内存页面(Page)移到磁盘上的交换空间(Swap Space)或文件缓存中,以释放物理内存供其他进程使用。当需要再次访问这些页面时,它们会被从磁盘中读回内存。
pgpgout是操作系统性能监控中的一个关键指标,表示页面从物理内存被写出到磁盘的速率。当 pgpgout 的值增加时,说明系统正在频繁地进行页面调度,这可能是由于物理内存不足或某些进程使用了大量内存。

二、问题分析

原主库数据库日志:

20:51 worker took too long to start; canceled
20:55 terminating connection due to unexpected kingbase exit
从数据库日志结合现场情况分析,业务一些连接受到影响,应用反馈卡顿,怀疑系统资源紧张造成数据库运行卡顿,性能收到影响。

此时再看集群日志repmgr.log:

[2024-05-17 20:50:58] [WARNING] unable to ping "host=172.20.1.4 user=esrep dbname=esrep port=54321 connect_timeout=10 keepalives=1 keepalives_idle=2 keepalives_interval=2 keepalives_count=3 tcp_user_timeout=9000"
[2024-05-17 20:50:58] [DETAIL] KCIping() returned "KCIPING_NO_RESPONSE"
[2024-05-17 20:50:58] [WARNING] connectI/On to node "node1" (ID: 1) lost
[2024-05-17 20:50:58] [DETAIL]
[2024-05-17 20:50:58] [INFO] attempting to reconnect to node "node1" (ID: 1)
[2024-05-17 20:51:08] [ERROR] connectI/On to database failed
[2024-05-17 20:51:08] [DETAIL]

repmgr进程尝试连接主节点但通讯失败,通过对数据库日志的分析可以判断数据库运行卡顿造成的集群主节点通讯异常,而此原因往往和操作系统I/O性能相关。后面我们还会提到I/O相关问题,下面继续分析

操作系统message日志:
几乎在数据库异常同时,操作系统显示kingabse进程发生core dump,但最终进程超时退出。
May 17 20:50:48 new-oadb1 kernel: [5] kingbase[8]: segfault at 500000256 ip 000000000097e..................................
May 17 20:50:48 new-oadb1 kernel: [58030] Code: 89 6d 18 4c 89....................(此处忽略程序崩溃地址信息)
May 17 20:50:48 new-oadb1 systemd[1]: Started Process Core Dump (PID 6/UID 0).
coredump超时退出,此处也有可能和I/O相关
May 17 20:55:48 new-oadb1 systemd[1]: [email protected]: Service reached runtime time limit. Stopping.
May 17 20:55:51 new-oadb1 systemd[1]: [email protected]: Failed with result 'timeout'.

至此已经没有更多的信息,如果希望继续分析,我们需要更多的信息支持,例如操作系统资源使用情况。
随后我联系现场收集nmon日志并继续分析。具体信息图片不方便暂时,所以我用文字描述代替。

nmom查看MEM:
memfree(空闲物理内存)突然降低:
从20:51:04的22199.2
到20:51:34的4996.8往后一直降低
20:52:04降低到1GB左右
这里swap显示为0,这个操作系统没有启用swap内存。

查看DISK_SUMM:
Disk Write KB/s从几十KB/s突然增加达到280791.8KB/s

查看PROC:
20:51:04 pswitch从700多增加到14000多,这个数字与进程切换相关。这个指标增加很有可能是并发进程数增加。
从这个时间开始,block的进程也从0慢慢增长。

查看TOP:
相同的kingbase进程占用resset物理内存数量从20:51:04开始一直增长,从之前的1041060增加到14109520,22886728....这是十多倍的增长速度。
其他kingbase进程相同现象。经询问现场情况,这些kingbase进程是客户端的连接进程,不是数据库后台进程。

查看VM:
VM几个关键指标说明:
20:51:04这几个指标都有明显的增长。
在Linux的内存管理和监控中,nr_mapped、nr_writeback、pgpgout、pgfree 和 pgalloc_normal 是与内存使用和分配相关的关键指标。以下是这些指标的详细解释:

nr_mapped:
意义:nr_mapped 通常表示当前系统中被映射到进程地址空间的文件页的数量。当一个文件的部分或全部内容被读取到内存中时,这些内存页会被标记为“映射”(mapped),以便进程可以访问它们。
相关信息:在Linux中,文件通常不会直接加载到进程的地址空间,而是使用一种称为“内存映射”的技术。这种技术允许进程像访问内存一样访问文件内容,提高了访问速度和灵活性。
nr_writeback:
意义:nr_writeback 表示当前正在等待被写回到磁盘的脏页的数量。脏页是指已经被修改但尚未写回到磁盘的内存页。
Linux writeback机制:Linux采用了一种称为writeback的机制来处理脏页。当内存页被修改后,它们会被标记为脏页,并等待内核在适当的时机将其写回到磁盘。这个过程是异步的,以避免因频繁的磁盘I/O操作而影响系统的整体性能。
触发时机:内核会在多种情况下触发writeback操作,如当系统空闲、脏页数量达到阈值或进程显式调用sync/fsync等系统调用时。
pgpgout:
意义:pgpgout 表示从主存(内存)写入块设备(如硬盘)的页面数量。这通常发生在内存页需要被替换或回收时,其内容被写回到磁盘上的交换空间或文件系统中。
与pswpin/pswpout的区别:pgpgout主要关注主存与块设备之间的页面写出操作,而pswpin和pswpout则关注虚拟内存中从块设备swap区中读入/读出的页面,这个造作系统没有启动虚拟内存,该值均为0.
pgfree:
意义:pgfree 表示被释放到空闲内存列表中的页面数量。当系统检测到有内存页不再需要时(例如,缓存数据过期或被替换),这些页面会被释放回操作系统,以便其他进程或系统组件可以使用。
作用:pgfree是Linux系统中一个非常重要的内存管理操作,它有助于有效地管理内存资源,避免内存泄漏和浪费,提高系统的稳定性和性能。
pgalloc_normal:
意义:pgalloc_normal 表示在normal内存区域中成功申请的页面数量。在Linux中,物理内存被划分为多个区域(zones),每个区域有不同的属性和用途。normal区域是其中之一,通常用于存储大多数进程和数据的内存页。
内存分配与回收:当进程需要内存时,它会向操作系统申请一定数量的内存页。如果系统中有足够的空闲内存,操作系统会为该进程分配相应的内存页,并更新相应的计数器(如pgalloc_normal)。如果系统内存不足,操作系统可能会采取一系列措施来回收内存,如通过页面交换(swapping)或页面压缩(compactI/On)来腾出更多的内存空间。
归纳:
这些指标共同反映了Linux系统内存使用、分配和管理的各个方面。通过监控和分析这些指标,管理员可以更好地了解系统的内存使用状况,诊断潜在的性能问题,并进行相应的优化和调整。
注意:如果这些指标(nr_mapped、nr_writeback、pgpgout、pgfree、pgalloc_normal)在同一时间都在增长,这通常表明系统正在进行大量的内存操作和磁盘I/O活动。

原因推断:
1、物理内存不足:

系统正在尝试通过页面调度来释放物理内存,以满足新的内存需求。(pgpgin/pgpgout增加)
2、进程内存使用不当:

某些进程可能占用了大量内存,导致系统频繁地进行页面调度,这里可对应之前我们在TOP页分析的kingbase进程占用内存不断增加的情况。
被写回到磁盘的脏页的数量增加:怀疑此时数据库有大量更新操作导致脏页数据急剧增加,影响系统I/O性能。
3、磁盘I/O瓶颈:由于大量的页面被写出到磁盘(pgpgout),磁盘I/O可能成为瓶颈,进一步影响系统性能;被写回到磁盘的脏页的数量增加,怀疑此时数据库有大量更新操作导致脏页数据急剧增加,影响系统I/O性能。
潜在影响,性能下降:
频繁的页面调度和I/O操作会消耗操作系统资源,导致系统响应变慢。
物理内存被kingbase进程占用太多导致数据库响应不及时,影响业务进行。

三、问题解决方案

增加物理内存:
增加操作系统的物理内存是最直接的解决方案。这可以显著减少页面调度的频率,提高系统性能。当然要同时增加数据库共享内存shared_buffer
优化应用程序:
评估和优化应用程序的内存使用模式,确保它们有效地使用内存并避免不必要的内存分配。合理规划前端会话连接时长,避免空闲会话长时间不释放占用物理内存。
建议使用连接池管理连接数量,连接时长等,避免大量连接会话并发写入,导致脏页过多,消耗大量I/O资源。
调整系统参数:
调整操作系统的内存管理参数,增加了swap空间,以前是0,建议增加30G左右的swap,以影响系统使用交换空间的倾向。
监控和调整工作负载:
对于高内存需求的进程,考虑使用资源限制或优先级调度来优化工作负载分配。避免高内存消耗使用数据库出现coredump的情况。
考虑使用更快的存储设备:
如果磁盘I/O成为瓶颈,考虑使用SSD等更快的存储设备来提高I/O性能。
数据库会话监控部署,kwr部署,监控TOP SQL等

四、总结

当操作系统出现memfree降低、pgpgout增加和大量I/O写入等情况时,通常意味着系统正在经历内存压力。通过增加物理内存、优化应用程序、调整系统参数、监控和调整工作负载以及考虑使用更快的存储设备等方法,可以有效缓解这一问题,提高系统性能。

标签:20,操作系统,数据库,响应,内存,进程,磁盘,KingbaseES,页面
From: https://www.cnblogs.com/kingbase/p/18280390

相关文章

  • KingbaseES 对象状态规则总结
    KingbaseES的PLSQL对象包括函数、存储过程、触发器、包、包体、对象类型、对象类型体和匿名块,其中匿名块即用即销,不具有状态属性,SQL中存在依赖的常见对象是表,视图,索引,自定义类型,自定义操作符等等。在使用编码过程会存在相互引用和被引用,就会导致对象的增删改无法“顺利”进行,本文......
  • KingbaseES 自定义操作符使用示例
    本文详细介绍了KingbaseES中在兼容适配过程中,当遇到不支持的操作符,如何通过自定义方式解决兼容适配问题。Kingbase自定义操作符语法和用例如下:用例数据:createtabledemo(idnumeric(10,5));insertintodemovalues(1.1);insertintodemovalues(0);insertintodemoval......
  • KingbaseES 集群运维典型案例 03 --“双主” sys_rewind恢复机制
    案例说明:主库主机系统重启,触发failover切换,原主库系统启动后,数据库服务被启动,出现“双主”,使用“repmgrnoderejoin--force-rewind”恢复集群。通过本案例了解,集群“双主”产生的原因及解决方案,并熟悉sys_rewind在集群恢复中的应用。数据库版本:KingbaseESV8R6一、集群架构......
  • 聊一聊PostgreSQL数据库,以及PostgreSQL认证体系
    PostgreSQL数据库简介PostgreSQL是一种强大的开源关系型数据库管理系统(RDBMS)。它具有以下显著特点和优势:强大的功能:支持丰富的数据类型,包括数组、JSON、XML等复杂数据类型。提供完善的事务处理机制,确保数据的一致性和可靠性。高度的可扩展性:可以通过自定义函数、存储过程和......
  • 修改数据库的默认校对规则
    在Linux下,要修改MySQL服务器的默认字符集和校对规则,您需要按照以下步骤操作: ###1.查找MySQL配置文件 首先,您需要找到MySQL的配置文件。配置文件通常位于`/etc/mysql/my.cnf`或`/etc/my.cnf`。您可以使用`find`命令来查找它: ```bashsudofind/-namemy.cnf```......
  • 高性能响应式UI部件DevExtreme v24.1.4全新发布
    DevExtreme拥有高性能的HTML5/JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NETCore,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac,到ASP.NETCore或Vue,DevExtreme包含全面的高性能和响应式UI小部件集合,可在传统Web和下一代移动应用程序中......
  • C#中将多个excel档案汇总为一个excel档,并批量汇入oracle数据库
    privatevoidbt_bach_oracle_Click(objectsender,EventArgse){//將下載的excel匯總為一個excelstringsourceFolder=@"D:\123";//源文件夹路径stringdestinationFolder=@"D:\456";//目标文件夹路径stringdest......
  • SpringBoot中集成screw(螺丝钉)实现数据库表结构文档生成
    场景经常会有编写数据库表结构文档的时间付出,那能否通过简单配置实现自动生成。screwscrew(螺丝钉)英:[skruː]~简洁好用的数据库表结构文档生成工具。https://gitee.com/leshalv/screw特点简洁、轻量、设计良好多数据库支持多种格式文档灵活扩展支持自定义模板数......
  • 运维文档:MySQL 数据库备份与恢复
    运维文档:MySQL数据库备份与恢复1.概述本文档旨在提供MySQL数据库备份与恢复的详细步骤和操作指南,以确保数据的安全性和可恢复性。2.备份方案2.1备份类型逻辑备份:备份数据库中的数据文件,包括数据表、视图、存储过程等。物理备份:备份整个数据库实例,包括数据文件、日......
  • 如何从 Firebase 保存和显示 Firestore 数据库中的图像
    我正在使用Flask使用Python编写一个用于IT研究的应用程序。我使用FirestoreDatabase作为数据库。一切都很好,但我想知道是否可以将照片保存到给定的集合并从网站上的集合中读取/显示这张照片?我的端点可以更改我想要的用户设置上传这张照片,当然,在正确上传显示之后:@b......