草庐IT

PG数据库运维中的操作系统关注点

白鳝 2023-03-28 原文
​现在PG数据库在用户侧的应用场景日益丰富,很多国产数据库也与PG开源项目有着很深的渊源,在使用过程中的一些基本运维规则也与PG开源数据库十分近似。今天我们从操作系统的角度来看一看PG数据库日常运维中需要关注的一些问题。

目前大多数用户侧的PG数据库规模都比较小,应用系统也都不太复杂,因此大多数情况下,数据库日常运维的难度并不大,不像Oracle这样复杂的数据库系统,遇到些问题还不太容易处理。在PG数据库日常运维上,只要关注下总会话数,活跃会化,并发访问,TOP SQL,一般也就够用了。反而在操作系统层面,需要多加关注。

在这种情况下,操作系统的各种资源是否充足是决定数据库运行是否稳定的十分重要的因素。CPU、内存、IO、存储容量这四种资源是否充足决定了PG数据库的运行是否稳定。网络是否存在丢包、延时过大的问题,则会影响SQL语句执行的效率。一般情况下对这些多做关注,基本上就没有太大的问题了。

对于CPU资源,首先要观察在业务高峰期,r队列的数量长时间超过CPU线程数,甚至超过2倍。如果业务高峰期操作系统r队列的长度经常长时间(超过10分钟)超过CPU线程数,那么说明当前CPU资源在系统高峰期存在不足的问题,如果经常超过2倍,那么久应该准备扩容了。

对于内存资源,我们需要关注的是可用内存和交换器使用率这两个指标,因为OS内存中很多内存是用于CACHE/BUFFER的,所以空闲内存的指标指示性不够准确,使用可用内存可能更为准确一些,这个指标是说操作系统中还有多少真正可用于分配的内存。

MemAvailable指标的含义是当前内存中还可用于分配的所有内存的总和。如果这个值比较小了,说明当前的OS中可以用于分配的内存过小,系统存在隐患。

另外一个需要关注的指标是SWAP使用率,有些PG的使用攻略中甚至建议大家关闭SWAP,从而避免因为SWAP带来的性能不稳定。这种建议实际上是因为无法控制SWAP,以及控制SWAP带来的负面影响而采用的一种极端的措施。在当前的LINUX内核下,SWAP产生的原因十分复杂,因此干脆通过关闭SWAP来避开SWAP了。这种做法实际上是不可取的,因为你都没办法搞明白SWAP产生的原因,那么如果关闭了SWAP,一旦SWAP需要产生的时候,那么OS会采取更为极端的方式来对待,那就是OOM KILLER进程杀掉某些进程。如果正好Postmaster正好是那个倒霉蛋,那么就不是PG性能受到影响了,而是PG库就宕了。目前我们常用的Linux 7、8核心的swap算法已经都比较完善了,大多数情况下,SWAP不会对影响PG数据库性能比较严重的匿名块做SWAP,而会尽可能交换CACHE/BUFFER,因此只要基础的LINUX VM参数设置的比较合理,就无需惧怕SWAP的产生。而当系统的SWAP使用率一直居高不下(比如超过90%),才需要重点关注。

IO延时也是我们运维PG数据库时需要关注的,因为PG数据库的DOUBLE BUFFER特性,实际上IO延时对PG数据库的影响并不一定像对Oracle那么直接。有时候IO延时挺高了,但是PG数据库的性能似乎受到的影响还不算大。不过不管怎么样,IO延时低于20毫秒是运维PG数据库的一个基本底线。过高的IO延时肯定会对PG数据库长期稳定运行存在隐患(当PG数据库负载较小的时候,这种影响还不一定会体现出来)。在一个相对稳定的运行环境中,如果IO总量变化不大的时候,IO延时应该也是相对稳定的,如果IO总量不变的情况下,IO延时越来越长,那么说明底层IO设备或者后端存储存在问题,我们需要尽早关注,以免出现大问题。存储子系统的问题,对于数据库来说往往是致命的。

另外一个容易受到忽视,但是一旦出现问题就容易引发大问题的是操作系统层面的进程的状态。如果进程中出现了几类特殊的非正常进程,那么我们就需要加以关注了。如果这些进程属于postgres用户,那么就需要额外关注了。一般进程状态有r(运行或可允许),S(可中断的休眠状态),这两种状态的进程都是正常的。而处于D(不可中断的休眠状态)的进程往往是在等待IO完成等内核调用,这个状态如果短时存在,并且很快消失了,那很可能是IO性能存在问题,并不危险,如果系统中经常有大量进程处于D状态,那么就需要关注了,是不是OS在IO层面存在问题了。而且随着D状态的进程数量愈来愈多,OS的风险也越来越大,服务器从长远看,存在比较大的风险。另外T状态的进程也应该是一个临时状态,等进程归还资源后应该就立即被关闭了,如果有进程长期处于T状态,那么系统肯定存在某些风险,需要关注。同理是Z状态的进程(僵死)。关注OS中的这些非正常状态的进程的数量变化以及某个非正常状态的进程是否长期处于该状态,是我们PG DBA运维数据库系统时应该关注的。

OS层面需要关注的内容还有很多,比如通过lsof看看打开文件句柄的总数是否存在不合理的增长,ulimit参数的限制是否会出现风险,OS进程数量是否异常,dmesg和messages是否存在异常报错等,都是PG DBA需要经常去检查检查的。这些检查十分琐碎,有些也过于专业。因此PG DBA也需要构建一些工具,定期自动的去做巡检,从而确保数据库所运行的OS环境是安全的。今天时间关系,我们就先聊这么多吧。在12月30号晚上的分享中,我会给大家介绍一些更细的内容。​

有关PG数据库运维中的操作系统关注点的更多相关文章

  1. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  4. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  5. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  6. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  7. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  8. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  9. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  10. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

随机推荐