アクセスログと2Gの壁 – 2008年 3月4日

ここ最近頻繁に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=0

while [ $TIME != 24 ]
do

if [ $TIME -lt 10 ]
then
TIME=0$TIME
fi

if [ -e $LOG_FILE_$TIME ]
then
cat $LOG_FILE_$TIME >> $LOG_FILE
rm -f $LOG_FILE_$TIME
fi

TIME=`expr $TIME + 1`

done

exit 0
fi

visitorsを使うのをやめるか、Apacheのアクセスログから不要な(gif/css/jpg/js)ファイルをログに出さないようにして凌ぐか・・・。アクセス傾向が知りたいだけなので、理想は3回に1回のリクエストしかログを出さないようにできれば、いいんですが・・・。

カテゴリー:技術・開発