ここ最近頻繁にApacheのアクセスログが落ちることが多く、原因を調査していると、「それは2Gの壁ですね。」との指摘を頂く。
Linuxには「2Gの壁」なるものが存在するらしく、lseek() などファイル内の読み出し位置を移動する関数に与える値の型に、signed long型 (2の31乗-1=2147483647)が使われており、この値が壁となっているとのこと。
基本的にLinux側は壁に対応しているが、Linux上にのるアプリケーション(今回ならばApacheのrotatelogs?)が対応していないと、こういった現象に陥る。
私のサーバーの場合も、毎日ログローテーションしているものの、ほぼ毎日アクセスログが2G以上となったために、エラーとなっていたようです。
そこで、ログローテーション処理を毎日じゃなく、毎時に変更してから、問題は収まった。
前:CustomLog “|/usr/sbin/rotatelogs /var/log/httpd/access_log_log_%Y%m%d 86400 540” combined
今:CustomLog “|/usr/sbin/rotatelogs /var/log/httpd/access_log_log_%Y%m%d_$H 3600 540” combined
アクセス集計にvisitorsを使っているため、分割したログを以下のようにして、1日分を1つにまとめているんですが、visitors側が結局2G以上のファイルを扱えないようで。。
#!/bin/sh
TODAY=`date +’%Y%m%d’ –date ‘1 days ago’`
LOG_FILE=/etc/httpd/logs/access_log_$TODAY
TIME=0while [ $TIME != 24 ]
doif [ $TIME -lt 10 ]
then
TIME=0$TIME
fiif [ -e $LOG_FILE_$TIME ]
then
cat $LOG_FILE_$TIME >> $LOG_FILE
rm -f $LOG_FILE_$TIME
fiTIME=`expr $TIME + 1`
done
exit 0
fi
visitorsを使うのをやめるか、Apacheのアクセスログから不要な(gif/css/jpg/js)ファイルをログに出さないようにして凌ぐか・・・。アクセス傾向が知りたいだけなので、理想は3回に1回のリクエストしかログを出さないようにできれば、いいんですが・・・。