nagios check_snmp

概要

nagiosのnrpeを用いたcheck_snmp監視を実施した際のメモ。

差分 --rate

ネットワークの量を求めるにはある時点とある時点の差分が必要。ある時点だけ高いなどあるからだと思われる。 SNMPはカウンタを用いて差分を求めるようにしている様子。カウンタはネットワークの総量との認識。

--rate-multiplier 8

計算の間隔を8秒にする。8秒にすることで単位をbpsにすることができる。

わかりにくいところ

差分を求める際に、ある時点からある時点への時間が10分だとした時に--rate-multiplier 8だと8秒ずつで区切って計算された 値が平均され取得されると思われる。

コマンドラインから試してみた

だいたい同じ値になるので、そうではなかろうか。

30秒
SNMP RATE CRITICAL - *26882812.12* | IF-MIB::ifHCOutOctets.3=26882812.12;5000000;10000000;

300秒
SNMP RATE CRITICAL - *27400005.63* | IF-MIB::ifHCOutOctets.3=27400005.63;5000000;10000000; 

Kibana5

概要

kibanaを5にUpdateした際にアクセスが出来なかったときのめも。

/etc/kibana/kibana.yml

netstat

netstat -tnpa

まとめ

kibanaにかぎらずブラウザからアクセスできずアプリケーションのログも出ない場合 netstatで正常にIPアドレスがアプリケーションにバインドされているかを確認すること。大事なり。

プロセス状態

概要

プロセスの状態について調べたことのメモ。

sleeping

とあるホストでpsコマンドを叩くとほとんどプロセスの状態がsleepになっていた。

$ ps auxf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         2  0.0  0.0      0     0 ?        S    Nov16   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    Nov16   0:00  \_ [migration/0]
root         4  0.0  0.0      0     0 ?        S    Nov16   0:00  \_ [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S    Nov16   0:00  \_ [stopper/0]
root         6  0.0  0.0      0     0 ?        S    Nov16   0:00  \_ [watchdog/0]
root         7  0.0  0.0      0     0 ?        S    Nov16   0:08  \_ [events/0]
root         8  0.0  0.0      0     0 ?        S    Nov16   0:00  \_ [events/0]
root         9  0.0  0.0      0     0 ?        S    Nov16   0:00  \_ [events_long/0]
root        10  0.0  0.0      0     0 ?        S    Nov16   0:00  \_ [events_power_ef]
root        11  0.0  0.0      0     0 ?        S    Nov16   0:00  \_ [cgroup]
root        12  0.0  0.0      0     0 ?        S    Nov16   0:00  \_ [khelper]

・
・
root         1  0.0  0.0  19232  1236 ?        Ss   Nov16   0:01 /sbin/init
root       537  0.0  0.0  11248   344 ?        S<s  Nov16   0:00 /sbin/udevd -d
root      1628  0.0  0.0  12400   552 ?        S<   Nov16   0:00  \_ /sbin/udevd -d
root      1629  0.0  0.0  12400   552 ?        S<   Nov16   0:00  \_ /sbin/udevd -d
root      1155  0.0  0.0  27596   712 ?        S<sl Nov16   0:00 auditd
root      1177  0.0  0.0 249088  1264 ?        Sl   Nov16   0:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
rpc       1203  0.0  0.0  18980   512 ?        Ss   Nov16   0:00 rpcbind
root      1362  0.0  0.0 200108  1432 ?        S    Nov16   0:19 /usr/sbin/snmpd -LS0-6d -Lf /dev/null -p /var/run/snmpd.pid
root      1388  0.0  0.0  66236   604 ?        Ss   Nov16   0:00 /usr/sbin/sshd
root     20200  0.0  0.0 102084  4464 ?        Ss   07:56   0:00  \_ sshd: root@pts/0 
root     20206  0.0  0.0 111880  5592 pts/0    Ss   07:56   0:00      \_ -bash
root     23654  3.0  0.0 110352  1152 pts/0    R+   08:30   0:00          \_ ps auxf

実行可能状態のプロセスはこのコマンドを打ったpsのみ。他は全部S。

straceで処理をみる

straceでどんな処理をしているのかを見てみた。

適当にプロセスを選ぶ

$ strace -p 1615
Process 1615 attached
read(0, 
$ strace -p 1388
Process 1388 attached
select(6, [3], NULL, NULL, NULL

別の端末でvmstat 1で1秒おきに表示

root     24143  1.3  0.0 102084  4340 ?        Ss   08:38   0:00  \_ sshd: root@pts/1 
root     24149  1.0  0.0 111896  5528 pts/1    Ss   08:39   0:00      \_ -bash
root     24185  0.0  0.0   6260   696 pts/1    S+   08:39   0:00          \_ vmstat 1

vmstatをstraceでみてみた。これもpsでみるとS

$ strace -p 24185
Process 24185 attached
restart_syscall(<... resuming interrupted call ...>) = 0
lseek(3, 0, SEEK_SET)                   = 0
read(3, "MemTotal:        8001920 kB\nMemF"..., 2047) = 1170
lseek(4, 0, SEEK_SET)                   = 0
read(4, "cpu  717231 881 184526 16100359 "..., 65535) = 1152
lseek(5, 0, SEEK_SET)                   = 0
read(5, "nr_free_pages 1161281\nnr_inactiv"..., 2047) = 1912
write(1, " 0  0  23164 4645124 206708 2733"..., 85) = 85
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({1, 0}, 0x7ffd056041d0)       = 0

なぜsleepだけなのか

straceでプロセスをみると、readやwriteやsleepなどの処理が実行されている。たぶん、プロセスの処理の中でこれが大半を占めていて、待ちになっている割合のほうが多いと思われる。もちろんそれ以外のプログラムの箇所もあるだろうが、わずかで一瞬で終わるのじゃないだろうか。Rの状態はあるけれども一瞬過ぎてpsなどでは捉えられない?

CentOSのリポジトリとか

概要

CentOSリポジトリについて調べたことのメモ。

デバッグ情報リポジトリ

デフォルトでCentOS-Debuginfo.repoが入っている。 デバッグ情報付き?のパッケージをインストールするときは基本これだけ??

yum-config-manager

例えばCentOS-Debuginfo.repoを常時使えるようにする場合は下記のコマンドを打てばよい。

yum-config-manager --enable debug

debuginfo-install

NAME
       debuginfo-install

SYNOPSIS
       debuginfo-install package

DESCRIPTION
       debuginfo-install  is a program which installs the RPMs needed to debug the specified package.  The
       package argument can be a wildcard, but will only match installed packages.  debuginfo-install will
       then enable any debuginfo repositories, and install the relevant debuginfo rpm.

EXAMPLES
       Download and install all the RPMs needed to debug the kernel RPM:
              debuginfo-install kernel

debuginfo repositoriesを有効にして関係あるdebug情報付きのRPMをインストールする。と思ったけど、debuginfoを有効にしていないとうまくコマンドでインストールできない。

まとめ

yum-config-manager --enable debug してから debuginfo-install package などする

rediscluster

概要

redisclusterを使ってみたので自分メモ。

rubyからrediscluster

最初はこれを元に修正してrubyからclusterを扱おうと思ったが、expireなどにはまだ対応していなかったのでrubyからは断念。

GitHub - antirez/redis-rb-cluster: Redis Cluster Ruby client based on redis-rb

まだrubyからはあまり対応していないのかな?

github.com

phpからrediscluster

phpからredisclusterを扱うことは割りと情報が沢山あったように思えた。実際にphpredisを使ってクラスタをうまく扱うことができた。

phpredis/cluster.markdown at develop · phpredis/phpredis · GitHub

redisclusterに対して個別にset、get

rediscluster対応ではないphpから個別にクラスタ構成のredisに対してsetすることでも上手く行くのかなと思ったが(クラスタへのredis-cliのような)、どうも受け取ったクラスタのredisから他のredisにデータを渡すときにエラーが出るようで上手く行かないらしい。

一般ユーザでansibleを実行

概要

一般ユーザでansibleを実行しようとしたけど失敗するので色々みてみた。

実行

ansible -m shell -a "while true; do date; ls -l; sleep 5; clear; done;" -s --ask-sudo-pass ホスト名

PSコマンドでみてみた

root        \_ sshd: 一般ユーザ名 [priv]
一般ユーザ名     \_ sshd: 一般ユーザ名@pts/1
一般ユーザ名         \_ /bin/sh -c sudo -H -S  -p "[sudo via ansible, key=xxxxxxxxxxxxx] password: " -u root /bin/sh -c 'echo BECOME
root                    \_ sudo -H -S -p [sudo via ansible, key=xxxxxxxxxxxxxx] password:  -u root /bin/sh -c echo BECOME-SUCCESS-bl
root                        \_ /bin/sh -c echo BECOME-SUCCESS-bltxuqbmpqpefrbgfvxtpbbxhdlhteio; LANG=ja_JP.UTF-8 LC_ALL=ja_JP.UTF-8 LC_MESSAGES=ja_JP.
:
:
:
root                 \_ /bin/sh -c while true; do date; ls -l; sleep 5; clear; done;

-u root

sudo -H -S -p[] -u root

ansibleの内部でsudo -u rootして/bin/shをしているようだった。この後のコマンドはこのシェルから実行していると思われる。なので

$ ansible -m shell -a "cat /var/log/secure " -s --ask-sudo-pass ホスト

sudoで許可しない設定にしているsecureログでもcatできるようだった。

-u root /bin/sh が内部で実行している限り、強制的に一般ユーザで実行できないのだろうか?

メモ

ansibleを実行するときに-u をつける。その時は別名をつける??

phpからredisを利用する

概要

phpよくわかってません。 phpインタプリタがリンクする共有ライブラリを確認したときに、peclでインストールしたredisの共有ライブラリがなかったので どうやってリンクしているんだろうと思ったときのメモ

phpからredisを使う

やはりredisが指定されていない。

$ ldd /usr/bin/php
        linux-vdso.so.1 =>  (0x00007ffe209cf000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fe868113000)
        libedit.so.0 => /usr/lib64/libedit.so.0 (0x00007fe867ee4000)
        libncurses.so.5 => /lib64/libncurses.so.5 (0x00007fe867cc1000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fe8679bb000)
        libbz2.so.1 => /lib64/libbz2.so.1 (0x00007fe8677aa000)
        libz.so.1 => /lib64/libz.so.1 (0x00007fe867593000)
        librt.so.1 => /lib64/librt.so.1 (0x00007fe86738b000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fe867107000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fe866f02000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fe866ce9000)
        libxml2.so.2 => /usr/lib64/libxml2.so.2 (0x00007fe866996000)
        libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fe866751000)
        libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fe86646a000)
        libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fe86623e000)
        libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fe866039000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007fe865dcc000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007fe8659e8000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fe865653000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fe865439000)
        libfreebl3.so => /lib64/libfreebl3.so (0x00007fe865236000)
        libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fe865014000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fe868350000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fe864dfe000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe864be1000)
        libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fe8649d5000)
        libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fe8647d2000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fe8645b2000)

peclでインストールされる場所

peclなどでインストールしたphpの共有ライブラリは、専用のディレクトリに配置され、 phpインタプリタは実行時にそこをみにいくようだ。

pecl config-show
Configuration (channel pecl.php.net):

PHP extension directory        ext_dir          /usr/lib64/php/modules

extension directoryが配置される場所。

redisがあるか

$ ll /usr/lib64/php/modules/ | grep redis
-rwxr-xr-x. 1 root root  450624 Jun  9 15:06 redis.so

実行されているphpプロセスを確認

仮想メモリにロードされていることを確認。

cat /proc/9993/maps | grep redis
7f221e4f7000-7f221e560000 r-xp 00000000 fd:01 401352                     /usr/lib64/php/modules/redis.so
7f221e560000-7f221e760000 ---p 00069000 fd:01 401352                     /usr/lib64/php/modules/redis.so
7f221e760000-7f221e765000 rw-p 00069000 fd:01 401352                     /usr/lib64/php/modules/redis.so

他にも/usr/lib64/php/modules/ないのモジュールがリンクされていることを確認。