Author Archives: admin

ディスクの読み込み速度を測定する

Amazon Linuxでebsボリューム(汎用SSD)を測定。80MB/s程度でるが、負荷をかけ続けると低速化するはず。

$ sudo hdparm -t /dev/xvda1
/dev/xvda1:
 Timing buffered disk reads: 242 MB in  3.00 seconds =  80.61 MB/sec

r3.largeインスタンスで、インスタンスストア(ローカルのSSD)をベンチマーク。

$ sudo hdparm -t /dev/xvdb
/dev/xvdb:
 Timing buffered disk reads: 180 MB in  3.00 seconds =  59.90 MB/sec

Zend OPcacheを無効化する

opcache使ってると、ファイルを更新してから実際に反映するまでに微妙なラグが発生することがあります。
運用環境であれば特に問題ないのですが、開発用に使っているサーバでこのラグが決定的な作業効率の低下を招きます。

ということで、開発環境にopcacheを入れてしまって後悔している方は以下の方法で無効化しちゃいましょう。

opcacheの設定ファイル(だいたい以下のようなところにあると思う)を開き、

/etc/php.d/10-opcache.ini

以下のようにopcache.enabledを0にすればよい。

; Determines if Zend OPCache is enabled
opcache.enable=0

設定書き換えたら、必ずWebサーバは再起動しましょう!

Amazon Linuxでタイムゾーンを設定する方法

1行目のコマンドでタイムゾーンは設定できるが、glibcがアップデートされると、このファイルは上書きされてしまいます。2行目と3行目で、/etc/sysconfig/clock のタイムゾーンを日本時間にしておくことで、glibcがアップデートされても日本時間のままで動作します。

ln -sf /usr/share/zoneinfo/Japan /etc/localtime
echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock
echo 'UTC=true' >> /etc/sysconfig/clock

※おそらくCentOSやRHELでも動作しますが、動作検証は行っておりません。
※上記コマンドはrootで実行してください。

Zend OPcache をインストール

PHP5.5以降では、PHPスクリプトの実行速度の高速化に「Zend OPcache」を使うのが一般的です。
Amazon Linuxであれば以下の手順で適用できます。簡単ですね。

phpinfo()で、Zend OPcacheが有効になっているか確認できます。

#プラグインをインストール
sudo yum install php56-opcache
#Apacheを再起動
sudo /etc/init.d/httpd restart

AmazonLinuxにPHP7.0.1をいれてみた。

AmazonLinuxにPHP7.0.1をいれてみた。

#とりあえずアップデート
sudo yum update -y

#CentOS/RedHat用のレポジトリを追加します。(Amazon LinuxにはPHP7.0系が存在しないので)
sudo rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm

#インストールします。
sudo yum install --enablerepo=webtatic-testing php70w php70w-devel php70w-mysql php70w-mbstring php70w-pdo

#phpinfoを設置
sudo sh -c 'echo "<?php phpinfo();" > /var/www/html/index.php'

#Apacheを起動
sudo /etc/init.d/httpd start

※http://サーバのアドレス/ でphpinfoの画面が見えるはずです。
※80番ポートの開け忘れに注意
※サービスの自動起動の設定は sudo chkconfig httpd on とかでどうぞ。
※AmazonLinuxの公式レポジトリに来るまでは、本サービスでの利用はオススメしません。

Amazon Linuxにmuninをインストールする。

以下のコマンドを実行すると、AmazonLinuxのインスタンスにmuninをインストールできます。
2行目はadminという名前のユーザをpasswordというパスワードで作るという意味なので、ちゃんとしたパスワードを設定してください。

インストールが完了すると/var/www/html/munin/というディレクトリが作成され、5分間隔でサーバ負荷が記録されていきます。
※インストールしてから5分以内の場合は、データができていない場合があるので、少し待ってから確認するとよいです。

sudo yum install -y munin --enablerepo=epel
sudo htpasswd -b /etc/munin/munin-htpasswd admin password
sudo service httpd restart
sudo service munin-node start
sudo chkconfig munin-node on

OOM Killerに殺されないようにする

OOM Killerとは、Linuxでメモリが枯渇したときに召喚される死神です。OOM Killerが召喚されると、重要度が低いプロセスの中で、メモリを多く消費しているプロセスが殺されます。重要度は、プロセス毎に指定されているoom_score_adjという値によって決まり、小さな物ほど重要なプロセスとして扱われます。oom_score_adjのデフォルト値は0で、-1000から1000の値をとります。sshdなどの重要なプロセスは-1000が指定されているため殺されません。

以下のスクリプトを実行すると、oom_score_adjが0以外のプロセスを表示します。

for dir in /proc/[0-9]*; do
  if [ "`cat $dir/oom_score_adj`" != 0 ]; then
    echo "`cat $dir/comm` : `cat $dir/oom_score_adj`"
  fi
done | sort | uniq

私の環境では以下のようなプロセスが0以外に設定されていました。

auditd : -1000
sshd : -1000
udevd : -1000

この環境で、mysqldの優先度を上げてみます。(Apacheがメモリを食ったときにmysqldが殺されるとヤッカイなことになります。Apacheはどんどんプロセスを作っているので殺されてもあまり問題ないですが、mysqldが殺されると死んだままになります)

mysqldの優先度を、手動で毎回書き換えるのは現実的ではないので、init.dにあるmysqldの起動スクリプトを書き換えました。
/etc/init.d/mysqld

        if [ $ret -eq 0 ]; then
            action $"Starting $prog: " /bin/true
            touch $lockfile
            echo '-100' > "/proc/`cat $mypidfile`/oom_score_adj"
        else
            action $"Starting $prog: " /bin/false
        fi

mysqldを再起動し、プロセスの優先度を確認すると、以下のようになっていました。

auditd : -1000
mysqld : -100
sshd : -1000
udevd : -1000

これでhttpdがメモリを食った結果、mysqldが殺されるということは防げそうです。

参考
今回のお題 – OOM Killer に殺されないようにする

head

headコマンドは、ファイルの先頭を表示するためのコマンド。デフォルトでは10行だが、もうちょっと見たい時は-nオプションをつかう。(numberと覚えよう)

head -n 40 bigfile # bigfileの先頭40行表示する

※ファイルの末尾を見るにはtailコマンドを使う
※パイプでつなぐことで、他のコマンドの実行結果の先頭を見ることもできる

# head --help
Usage: head [OPTION]... [FILE]...
Print the first 10 lines of each FILE to standard output.
With more than one FILE, precede each with a header giving the file name.
With no FILE, or when FILE is -, read standard input.

Mandatory arguments to long options are mandatory for short options too.
  -c, --bytes=[-]K         print the first K bytes of each file;
                             with the leading '-', print all but the last
                             K bytes of each file
  -n, --lines=[-]K         print the first K lines instead of the first 10;
                             with the leading '-', print all but the last
                             K lines of each file
  -q, --quiet, --silent    never print headers giving file names
  -v, --verbose            always print headers giving file names
      --help     display this help and exit
      --version  output version information and exit

K may have a multiplier suffix:
b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,
GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
For complete documentation, run: info coreutils 'head invocation'

Sendmailを止めたり消したり

AmazonWebServicesでAmazon Linuxを起動すると、標準でSendmailがインストールされていて、自動起動も設定されています。しかし、AWSでメールを送るなら、Amazon SESを使うことも多いですし、そもそもE-mailを送信する必要のない場合も多いです。使わないのにSendmailを起動していると、リソースを無駄に消費するだけでなく、スパムの送信元や、スパムの中継に使われてしまうリスクもあります。

ということで、使わないならSendmailは消しましょう。

Sendmailを止める方法

service sendmail stop

Sendmailを消し去る方法

yum remove sendmail