现在国内基于PG或者衍生自PG的数据库越来越多,PG社区版的用户也在快速增长,多多学习关于PG对于以后DBA的转型还是很有用的,所以这几天我们会讨论更多PG相关的问题。昨天我们讨论了PGIO优化问题,今天我们来讨论一个核心CPU相关的问题。今天的话题是,如果PG数据库服务器的CPU占用率突然升高,我们应该从哪些方面来分析。如果遇到数据库服务器CPU占用率突然升高或过高的问题,不管是哪种数据库,首先要检查操作系统上是否有非数据库进程占用过高的CPU资源。这个使用TOP工具就可以实现。不要因为SWAP、大规模CACHEDROP等操作导致的CPU占用率突然升高而让数据库背锅。你分析了很多,发现跟数据库没有关系。几年前,我遇到过一个案例,一个用户让我帮忙分析一下为什么他们的CPU突然就100%了。我没有注意这些问题。我在数据库里找问题,最后分析了一大圈,发现loads。与前一天没有区别,只是CPU占用率增加了30%。后来实在是没办法了。用TOP查了一下,发现有一个异常的过程,其实是在做科学计算。这个进程正好消耗了30%以上的CPU资源。最后客户确认了下,不好意思的说是几年前设置的crontab任务忘记关闭了,才导致今天的问题。几年前,他们从事数据库合并。只要一个月内单日业务高峰期CPU使用率不超过数据库的35%,就必须合并到其他数据库中,以节省资源。搞了好几个系统,觉得太难了,于是部门领导想出了一个窍门。在月底的业务高峰期,他们让一个科学计算任务跑了几个小时,这样就减少了可以合并的数据库数量。也少做功课。没想到忘记关掉这台服务器上的任务了。这些年,这个系统的数据量越来越大,负载也越来越大。没想到这个月底业务很忙,CPU要炸了。.另外,如果一台物理机上运行着多个数据库实例,我们不能只看一个数据库的情况,还要看多个数据库的整体负载情况。另外,如果排除这些问题,我们只讨论PG数据库,如果真的是PG数据库导致CPU突然升高,我们应该怎么分析呢?今天简单罗列了一些常见的场景。遇到问题时,DBA可以一一排查。首先,也是最有可能的方面,大查询或者高并发的SQL执行计划变坏了:如果数据库中一个查询或者一组查询的复杂度增加,可能会导致CPU使用率增加;一个常见的SQL执行计划错误也会导致执行开销增加。虽然单条SQL的延迟还在业务的可承受范围内,但是整体的CPU消耗会明显增加。如果CPU资源出现瓶颈,系统的整体性能将严重下降。.二、资源竞争严重:如果多个连接或会话同时请求大量数据,可能会出现资源竞争,甚至自旋锁等自旋锁可能引起争用,导致CPU占用率上升。这方面分析通过PG的等待事件来分析原因比较有效。第三,缺少索引导致的SQL执行计划不够优化:如果数据库表缺少索引,查询操作将需要扫描整张表,导致CPU占用率增加。四、磁盘IO瓶颈:如果数据库的磁盘IO不能满足需求,可能会导致CPU占用率上升。这可能会让我的朋友感到惊讶。当IO出现瓶颈时,session不就是在等待IO吗?它如何导致CPU问题?PostgreSQL使用同步阻塞IO(BufferedIO)。同步阻塞IO是指PostgreSQL在完成IO操作之前会阻塞等待IO操作完成。当数据库服务器需要读取或写入数据到磁盘时,它会阻塞其他操作,直到IO操作完成。这种情况下IO延迟会比平时高很多,IOWAIT占CPU使用率的比例也会比较高。五、数据库维护任务:如果数据库正在进行大规模维护任务(如VACUUM、ANALYZE等),可能会导致CPU占用率升高。六、缓冲区污染:这种情况发生的概率较低,发生后很难被发现。当缓存中的大部分数据是很少使用的数据时,就会出现缓存污染,导致缓存频繁未命中,CPU利用率升高。当缓存污染发生时,CPU会花更多的时间从存储中读取数据,而花更少的时间从缓存中执行指令。这会导致整体系统性能下降和CPU使用率增加。对于PG来说,shared_buffers配置在OS中所占的比例相对较低,采用DOUBLEBUFFER机制的数据库系统发生缓冲区污染的概率远高于Oracle等数据库。一旦发生缓冲区污染,如果不改变SQL执行计划,就会出现严重的性能下降,需要避免。对于经常出现类似问题的数据库,可以使用各种预热插件对热点数据进行持续预热,防止缓冲区污染。七、经常被全表扫描的小表,突然膨胀变大:这种情况发生的概率较低,但也比较容易发生。如果一个表关闭了VACUUM并且经常执行UPDATE操作,在Over一段时间后,可能会导致性能问题。CPU使用率突然升高的可能性有很多,但是对于PG数据库来说,这些问题大多是大并发SQL或者糟糕的SQL执行计划导致的。加强对SQL问题的监控,一般可以解决大部分问题。PG的CPU问题。今天时间有限,只讨论常见的故障场景。不断积累这方面的知识库是企业和DBA应该做的。这样的问题如果能够通过社区积累起来,就会事半功倍。我也希望大家有兴趣加入我们的DBAIOPS社区一起做这项工作。这项工作的成果将发表在D-SMART社区版中,我们将定期通过文章的形式报告总结。
