Server was too busy and OOM Killer fired

昨日からサーバーに繋がりにくくなっていた。
サーバーに繋がらなくなった。
大方 php-fpm のプロセスがたくさん増えて swap 発生しまくってるんだろうと思った。

1vCPU に 512MB しかない VM にそんなに多くを期待してはいけない。

IP アドレスでアクセス制限かけてたからどうせ外出先からじゃアクセスできないし、戻ったら直そうと思っていた。
メールを確認しようとしたらいよいよ認証も通らなくなったので OOM Killer 発動したかと思ってさくらの VPS のコンソール上からシリアルコンソール接続して
今つないでいる IP のアクセス許可して top を見てみた。

見事に殺されている。
yum-cron のプロセスが死んでるのはいいが、 mysqld (中身は MariaDB )のプロセスまで殺されるのは勘弁してほしい。

[root@mx1 ~]# grep "Out of memory" /var/log/messages
Oct  9 07:10:09 mx1 kernel: Out of memory: Kill process 7192 (yum-cron) score 77 or sacrifice child
Oct  9 08:05:56 mx1 kernel: Out of memory: Kill process 7354 (yum-cron) score 82 or sacrifice child
Oct  9 09:17:09 mx1 kernel: Out of memory: Kill process 7493 (yum-cron) score 73 or sacrifice child
Oct  9 10:07:45 mx1 kernel: Out of memory: Kill process 6905 (mysqld) score 52 or sacrifice child

圧倒的 php-fpm のプロセス数。

OOMKillerTop

圧倒的メモリ不足。

[root@mx1 ~]# vmstat -aS m
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 2  0   1059     70    223    140    0    0  3632    28   19   14  0  1 99  0  0

ひとまず静かにデーモンリスタート

[root@mx1 ~]# systemctl restart php-fpm

余裕が出てきた。

free

[root@mx1 ~]# vmstat -aS m
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 2  0     70    342     87     26    0    0  3632    28   19   14  0  1 99  0  0

おしまい。

Samba ファイルサーバーの構築 (CnetOS7.2)

認証無しで共有サーバーに書き込めるのがいいと思っていたけど、しゃべる NetBIOS のプロトコルのバージョンが下がって遅くなるんだよね。
なので pdbedit で認証されているユーザじゃないと書き込めないようになっています。
ちなみに Samba のバージョンは 4 系なので Active Directory ドメインコントローラとして動作させようと思えば構築できる。

[root@phy3 samba]# yum info samba
(snip)
名前                : samba
アーキテクチャー    : x86_64
バージョン          : 4.2.10
リリース            : 6.el7_2
容量                : 1.8 M
リポジトリー        : installed
提供元リポジトリー  : updates
要約                : Server and Client software to interoperate with Windows machines
URL                 : http://www.samba.org/
ライセンス          : GPLv3+ and LGPLv3+
説明                : Samba is the standard Windows interoperability suite of programs for Linux and Unix.

Samba のインストール

sudo yum -y install samba
sudo mkdir /var/samba

自分の共有フォルダを作成

mkdir ~/samba

既存のユーザを追加

こいつで認証を通す。

sudo pdbedit -a wnoguchi
new password:
retype new password:
Unix username:        wnoguchi
NT username:
Account Flags:        [U          ]
User SID:             S-1-5-21-3726826207-3823386518-2277225043-1000
Primary Group SID:    S-1-5-21-3726826207-3823386518-2277225043-513
Full Name:            Wataru Noguchi
Home Directory:       \\phy3\wnoguchi
HomeDir Drive:
Logon Script:
Profile Path:         \\phy3\wnoguchi\profile
Domain:               PHY3
Account desc:
Workstations:
Munged dial:
Logon time:           0
Logoff time:          木, 07  2月 2036 00:06:39 JST
Kickoff time:         木, 07  2月 2036 00:06:39 JST
Password last set:    水, 04  5月 2016 10:11:26 JST
Password can change:  水, 04  5月 2016 10:11:26 JST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

共有フォルダの所有者変更

自分しか使わないけどね。。。

sudo chown nobody:nobody /var/samba

Samba の設定

  • 設定ファイルバックアップ
sudo cp -rp /etc/samba{,.orig}
  • /etc/samba/smb.conf
[global]
unix charset = UTF-8
dos charset = CP932

workgroup = MYGROUP
↓
workgroup = PG1X

アクセス許可設定

;    hosts allow = 127. 192.168.12. 192.168.13.
↓
    hosts allow = 127. 172.16. 172.17. 172.18.

プリンタ使わない
    load printers = yes
    disable spoolss = yes

[homes]
    comment = Home Directories
    path = %H/samba

    vfs objects = recycle
    recycle:repository = .recycle
    recycle:keeptree = no
    recycle:versions = yes
    recycle:touch = no
    recycle:maxsize = 0
    recycle:exclude = *.tmp ~$*

[public]
    comment = Public Stuff
    path = /var/samba
    public = yes
    writable = yes
    only guest = yes
    vfs objects = recycle
    recycle:repository = .recycle
    recycle:keeptree = no
    recycle:versions = yes
    recycle:touch = no
    recycle:maxsize = 0
    recycle:exclude = *.tmp ~$*

smb, nmb 起動

sudo systemctl start smb
sudo systemctl start nmb
sudo systemctl enable smb
sudo systemctl enable nmb

ごみ箱を定期的に空にするスクリプトを作成

1ヶ月間 = 30 日 = 30 * 24 時間 = 720 時間 アクセスのないものは完全に削除する

sudo cat <<'EOF' >/etc/cron.weekly/recyclewatch
#!/bin/bash
for user in `ls /home/`
do
  if [ -d /home/$user/.recycle ]; then
    tmpwatch -f 720 /home/$user/.recycle/
  fi
done
if [ -d /var/samba/.recycle ]; then
  tmpwatch -f 720 /var/samba/.recycle/
fi
EOF
sudo chmod 744 /etc/cron.weekly/recyclewatch

ファイアウォールの穴を開ける

sudo firewall-cmd --permanent --zone=public --add-service=samba
sudo firewall-cmd --reload

接続の仕方

認証聞かれます。

Windows の場合

\\72.16.216.3
\\72.16.216.3\public\

Mac, Linux の場合

smb://172.16.216.3/
smb://172.16.216.3/public/

トラブルシューティング

認証は通るみたいだが接続はできない。

[root@phy3 samba]# tailf /var/log/samba/log.macbookair-d7e0
[2016/05/04 11:00:01.995083,  0] ../source3/smbd/service.c:798(make_connection_snum)
  canonicalize_connect_path failed for service public, path /home/samba
[2016/05/04 11:00:01.997818,  0] ../source3/smbd/service.c:798(make_connection_snum)
  canonicalize_connect_path failed for service public, path /home/samba
[2016/05/04 11:01:04.905785,  0] ../source3/smbd/service.c:798(make_connection_snum)
  canonicalize_connect_path failed for service public, path /home/samba

Oops… 書き間違い。
そもそも存在しないディレクトリを指定していたりするとこんなエラーになる。
修正する。

[public]
    comment = Public Stuff
    path = /home/samba
↓
[public]
    comment = Public Stuff
    path = /var/samba

そしてリスタート。

sudo systemctl restart smb
sudo systemctl restart nmb

参考サイト

  1. Windowsファイルサーバー構築(Samba) – CentOSで自宅サーバー構築
  2. CentOS7にSambaをインストール | 俺的備忘録 〜なんかいろいろ〜

MariaDB 10.1 を CentOS 7.2 にインストールする

/etc/yum.repos.d/MariaDB.repo を作成する。

# MariaDB 10.1 CentOS repository list - created 2016-05-01 03:05 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
sudo yum -y install MariaDB-server MariaDB-client
sudo systemctl enable mariadb
sudo systemctl start mariadb
[root@localhost ~]# systemctl status mariadb
● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/mariadb.service.d
           └─migrated-from-my.cnf-settings.conf
   Active: active (running) since 日 2016-05-01 03:14:18 UTC; 11s ago
 Main PID: 3783 (mysqld)
   Status: "Taking your SQL requests now..."
   CGroup: /system.slice/mariadb.service
           └─3783 /usr/sbin/mysqld

 5月 01 03:14:18 localhost.localdomain mysqld[3783]: 2016-05-01  3:14:18 140...
 5月 01 03:14:18 localhost.localdomain mysqld[3783]: 2016-05-01  3:14:18 140...
 5月 01 03:14:18 localhost.localdomain mysqld[3783]: 2016-05-01  3:14:18 140...
 5月 01 03:14:18 localhost.localdomain mysqld[3783]: 2016-05-01  3:14:18 140...
 5月 01 03:14:18 localhost.localdomain mysqld[3783]: 2016-05-01  3:14:18 140...
 5月 01 03:14:18 localhost.localdomain mysqld[3783]: 2016-05-01  3:14:18 140...
 5月 01 03:14:18 localhost.localdomain mysqld[3783]: 2016-05-01  3:14:18 140...
 5月 01 03:14:18 localhost.localdomain mysqld[3783]: 2016-05-01  3:14:18 140...
 5月 01 03:14:18 localhost.localdomain mysqld[3783]: Version: '10.1.13-Maria...
 5月 01 03:14:18 localhost.localdomain systemd[1]: Started MariaDB database ...
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]# mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.1.13-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> exit
Bye

CentOS 7.2.1511 に yum-cron 入れた

yum -y install yum-cron
systemctl start yum-cron
systemctl enable yum-cron

設定ファイル /etc/yum/yum-cron.conf はこれぐらいにしておけば OK 。

CentOS 6 時代は yum-cron を入れたら問答無用でアップデートを適用して再起動が必要だっら再起動する凶悪な仕様だったが、CentOS 7 の yum-cron はダウンロードするのみで止まるようだ。

僕は更新があったらメールを送るようにした。

apply_updates = no

#(snip)

[email]
# The address to send email messages from.
email_from = root@smtp.example.com

# List of addresses to send messages to.
email_to = username@example.com

# Name of the host to connect to to send email messages.
email_host = localhost