利用Script监控Linux,处理df命令折行

日常运维工作中,我们需要写很多script,根据script的输出,进行判断、给出报警等。 在Linux系统中,使用df命令时,存在一个问题,输出会出现折行(wrap): [root@rems2 tgt]# df -iFilesystem Inodes IUsed IFree IUse% Mounted on/dev/mapper/vg_rems2-lv_root 3276800 289823 2986977 9% /tmpfs 1005929 1 1005928 1% /dev/shm/dev/sda1 128016 51 127965 1% /boot/dev/mapper/vg_rems2-lv_home 26714112 4788 26709324 1% /home 如上所示,/ 文件系统的信息被折成了两行,这给我们的判断处理带来了问题。为解决此问题,我们可以使用 -P 参数。 [root@rems2 tgt]# df -PiFilesystem Inodes IUsed IFree IUse% Mounted on/dev/mapper/vg_rems2-lv_root 3276800 289823 2986977 9% /tmpfs 1005929 1 1005928 1%

使用ansible在云服务器上安装、启动nginx

最近在练习使用ansible,参照例子在云服务器(aliyun)上安装、启动nginx:前期准备:1. 在我的macbook上安装ansible brew install ansible2. 创建用于保存ansible playbook的文件夹 mkdir ~/playbooks3. 创建一个安装nginx所需的playbook目录 mkdir -p ansible-nginx/tasks/ touch ansible-nginx/deploy.yml touch ansible-nginx/tasks/install_nginx.yml4. 编辑主部署文件deploy.yml # ./ansible-nginx/deploy.yml- hosts: nginx tasks: - include: 'tasks/install_nginx.yml’ 5. 配置安装nginx的真正的部署文件 install_nginx.yml   # ./ansible-nginx/tasks/install_nginx.yml - name: NGINX | Installing NGINX repo rpm yum: name: http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm - name: NGINX | Installing NGINX yum: name: nginx state: latest -

利用DPA诊断Oracle锁等待问题

10:50分左右,REMS2系统发出系统性能告警,1套RAC的Active Session数量超过了200……收到告警之后,甲方DBA专家进入战位,查找原因。可是——现在的Active Session数量已经恢复了,往事不可追啊……REMS2 DPA出场~查看故障时间段,Active Session变化情况: 大概从10:48左右,Active Session持续增高,到10:53之后,由大概200左右,迅速恢复正常。我们使用DPA的BST History功能模块,查看问题最严重时,系统的Active Session都在干什么…… 可以发现,多个会话,在执行SQL ID为appfxqvj6scuv的SQL,因为无法获取enq:TM而被堵塞,这些会话本身又堵塞了其他的会话。Oracle中,一个DML操作,除了会以独占模式持有行级别的TX锁外,还需要持有表级别TM锁的共享模式,以防止在DML过程中,表的结构定义被修改(关于Oracle Enqueue、Lock机制此处不做过多描述)。现在这些会话无法获取到共享模式的TM锁,那说明什么? 说明TM锁被别的会话以独占模式持有,还没有释放……到这里,已经很清晰了,有人在业务高峰时期做了DDL操作,那么是改了表结构、还是建了索引呢?使用DPA的Top SQL模块,检查一下该时间段的SQL操作,如果有DDL操作,应为肯定耗时较长,会被记录下来…… 再次轻松几分钟诊断故障原因! 哦耶

在不同Linux发行版中awk的版本兼容问题

RedHat、CentOS系列发行版中,系统自带的awk是GNU awk 3.1.5(不同版本可能有所不同)。今天发现在aliyun上的Ubuntu中awk的行为与之前(RedHat上)不一致,检查一下发现Ubuntu中awk里的substr函数,其行为与GNU awk不一致,Ubuntu中默认的awk是mawk 1.2……GNU awk中,substr(‘/dev/vda:’,0,length(‘/dev/vda:’)-1) 会返回 /dev/vdamawk 1.2中, 返回的是/dev/vd

一次Bug诊断记录

友商维护的Oracle数据库10.2.0.5 + RAC + ASM 部署在vmware里……两个节点只能启动一个,另一个启动时会宕掉…… 友商工程师,跟客户说,你这是bug,你升级到11gR2才能打相关的补丁——这是屁话,意思就是:不是我不能给你解决,相当于给你重装一遍系统,你看着办吧……重装系统能够解决99.9%的问题——这个道理我在windows 95时代就已经明白了。 还是我们来吧…… 帮助客户就是帮助我们自己! alert 日志:Tue May 16 21:08:17 CST 2017ALTER DATABASE OPENPicked broadcast on commit scheme to generate SCNsTue May 16 21:13:15 CST 2017Errors in file /oracle/app/oracle/admin/yjjsdbs/bdump/yjjsdbs2_dbw0_6917.trc:ORA-00240: control file enqueue held for more than 120 secondsTue May 16 21:47:14 CST 2017alter database openTue May 16 21:47:14 CST 2017ORA-1154

Oracle活动会话异常增高诊断-续

……之前我们利用DPA-Lite,已经定位到LGWR进程在特定时刻,堵塞了几十、上百个会话,导致Active Session数量在短时间内出现高峰……之后是各种分析、诊断…… 到底是IO性能出现问题,还是Commit量太大,导致LGWR出现延迟,却是一时间无法分辨。甚至,由于REDO LOG是放在高端存储的SSD上的,SSD有无问题…… 每次“故障”也不过就10秒,想精确定位问题何其困难!我们还是通过DPA-Lite来仔细检查,看看能不能找出一些端倪……5月10日,16时左右,问题再现: 此时间段内,Active Session高峰多次出现;16:06:56秒,LGWR堵塞了68个会话; 我们仔细看一看都堵塞了哪些会话,有何特点…… 特点是: HTZT用户,通过JDBC连接的应用,在等待Commit; 当前操作的对象ID都是 131629872和131629864 通过DPA-Lite查询另外一个时间点: 再次确认了这个现象!我们再看看更早之前发生Active Session高峰时的现象(5月8日16时): 仍然是HTZT用户操作OBJECT ID 131629872 131629864时等待Commit……我们查询数据库,确认这两个对象,发现是一张LOG(日志)表和该表上的一个索引,这个表以BLOB方式保存日志,目前数据量极大——超过300G。使用DPA-Lite 查看对应时间段的Top Object: 问题时间点,对于该表索引的操作,在数据库中占用资源排名第一! 存储已经用的最高端的了,解决问题就从这个日志表入手吧……日志么,都是用来事后查询、分析使用的,我觉得存在文件系统里,利用Hadoop之类分析是最好不过的,核心数据库高端存储上存个几百GB的日志,还弄出这种问题来,赶紧迁走……一想到拿着这些证据,一会儿让应用开发那帮哥们哑口无言我就觉得兴奋!

Oracle活动会话异常增高诊断

近日,核心系统Oracle数据库集群的一个节点,多次出现Active Session超过100甚至超过300的现象,每次持续时间都是10秒左右,甚至只持续5秒以内…… 时间太短暂,我都来不及看清你的脸…… 头疼! 16:43:57 正常状态 16:44:58 发现LGWR 堵塞大量会话 16:45:08 堵塞情况依旧 16:45:19 恢复正常 系统在20秒时间内,由正常状态,一下切换到异常状态,Oracle Active Session在节点2上迅速超过300, 并且很快恢复……整个"异常”过程20秒,短暂到我们的REMS2 监控报警组件都没有发现这个异常(监控为了避免对系统的干扰,每2分钟检查会话情况)……还好有DPA-Lite, "事后"仍然可以进行"秒"级别状态回放…… 让我们知道当时发生了什么,利用DPA-Lite 就是十几分钟的事情,就可以知道LGWR产生了大量堵塞——如果没有DPA-Lite这样合适的工具,难以想象我们需要多久才能知道“作乱”的原来是LGWR……DPA-Lite Operation Screen Record. Screen Video

REMS在性能诊断、分析场景下的实用

下午4点半,rems2发出cpu负载高的警报——使用率超过50%。不是演习、不是测试,真正的核心系统:两台aix上的一套Oracle 10g RAC。 很明显16:30之后,cpu负载上升,一直到17:00,使用率在50%处波动~ 同时网络流量,内存,交换分区都很平稳: 检查数据库对应时段的指标,逻辑IO明显的高阶运行,激活会话数升到35左右,物理IO与用户调用无对应跳阶: 接下来,很自然的就是Top Session显示,Top SQL分析了~ 很遗憾,咱是生产核心系统,这些都不允许贴出来了😄  好的监控、性能分析工具,随着你的心意、方向,有如低扭强大的机械马达——让你御风而行

Oracle Case insensitive index searches

有几种方法来编写’case insensitive’的SQL语句——SQL需要避免全表扫描。如果是Oracle10g R2之前版本,我们需要:1. 在查询中转换数据,使其大小写不敏感(case insensitive),FBI(Function Base Index): create index upper_full_name on customer ( upper(full_name)); select full_name from customer where upper(full_name) = ‘SAM HENDRY’;2. 在存储数据(insert或者update)时,使用触发器完成case insensitive转换(比如使用to_lower,to_upper 内建函数)。3. 使用 alter session命令 alter session set NLS_COMP=ANSI; alter session set NLS_SORT=GENERIC_BASELETTER; select * from customer where full_name = ‘Sam Hendry' 在Oracle 10g R2版本中,引入了使用BINARY_CI BINARY_AI排序来进行case insensitive查询的功能。 初始化参数设置: NLS_SORT=binary_ci NLS_COMP=ansi 创建索引:

Fingerprints of Latch——使用V$LATCH_MISSES调优Latch Wait

Latch等待应该说并不是一件坏事情。毕竟,设计Latch的目的就是用来让你等待的。Oracle使用Latch来保护SGA区中的关键数据结构不会在一个进程正在访问、修改时被另外一个进程访问,避免SGA区关键数据结构出现Corruption。暂时的waiting要比内存corruption更让人接受,不是么?不过,如果经常性的出现两个或多个进程等待同一个Latch,这就是一个问题了。因为,当Latch被释放(free)时,正在等待此Latch的多个进程将争抢Latch的所有权,而且只能有一个进程如愿获得Latch的所有权;而其他参与争抢的进程将消耗无效的CPU时间去spin、wait。随着参与争抢Latch的进程数量增加,将会造成严重的性能问题;而如果这个问题能够得到解决,这个性能问题会迅速的消失。一般来讲,共有三种不同的latch争用问题:1. 高CPU占用可能会触发latch争用问题。试想,如果一个已经获得latch所有权的进程不能迅速的获得CPU使用时间片,对这个latch的大量等待当然就不可避免了。为了避免由于CPU饥饿(CPU starvation)造成的latch争用问题,你应该保证你的系统不会持续较长时间的出现CPU占用率超过85%的压力高峰(当然,在某些系统中高CPU使用率是安全的)。很多系统问题(check for run-away process、paging)都会造成CPU的过度使用,所以说,在诊断一个Oracle性能问题的时候,你应该首先确保他确实是Oracle问题——而不是OS操作系统问题。2. Oracle预期latch被间断的、简短的占用。一些Latch争用性能问题的出现恰恰是因为一个Latch被超出预期的长时间占用。这种类型的问题通常是由于SGA区中的某个访问受latch保护的链表增长的太长(比如Shared Pool的碎片太多、buffer cache中的hash chains太长等等)。 这种类型的latch争用问题对_spin_count初始化参数的设置非常敏感。如果spin循环的时间恰恰短于这种类型的latch能够被获取的时间,这时尝试获取latch的进程就会停止spin,转入sleep状态;这种情况下,如果适当增加_spin_cout参数,使得spin循环的时间能够赶上占用Latch进程释放latch的时间,就可以避免进程sleep。当然,最好的调节方法是减少latch占用的时间,而不是增加latch spin的时间。3. Latch争用的性能问题也可能并不是由于Latch hold时间太长,而仅仅是因为获取Latch占用权的请求太过频繁了。最典型的一个例子是因为commit太过频繁而造成的’redo allocation’latch的争用。 这种情况下,最好的解决办法当然是避免太过频繁的latch request;但是很多情况下,最有效的解决方案也是最不可能的方案。通常,我们可以通过增加相应的child latch数量来缓解这个问题(比如 cache buffer lru latch),增加_spin_count对这种类型的性能问题没有帮助。如果我们不能降低latch request的频率(比如修改应用commit的频率),而且这个latch也不属于默认的long latch类别(默认好像只有两个latch是long latch: shared pool 、library cache);因为long latch默认支持latch posting特性,我们可以通过设置初始化参数_latch_wait_posting为2来强制对所有的latch类型都支持latch wait posting。 ——对于这一点,我心存疑虑,latch wait posting毫无疑问对某些latch会有负面影响,或者会过多的消耗资源;不然Oracle为什么只默认支持shared pool、libarary cache的wait posting呢;所以除非十分必要且经过测试,这种手段还是谨慎使用了。很显然的,要想恰当的解决latch争用造成的性能问题,首先我们得判断它是属于哪种类型的latch争用。以上3中类型中,CPU starvation应该是最容易判断的;其他两种类型的latch可以通过v$latch_misses加以区分。这个视图中包含了request或者hold每一个latch对应的Oracle Kernel位置。SQL> desc v$latch_misses Name Null? Type ----------------------------------------- -------- ---------------------------- PARENT_NAME VARCHAR2(50) WHERE VARCHAR2(64) NWFAIL_COUNT NUMBER