😀
webサーバーaccessログ収集メモ[過去データ収集編]
apacheのアクセスログを解析する為にごにょごにょやってみたときのメモ
やりたいこと
apacheのアクセスログをmongodbに入れて解析をごにょごにょしたい。
今回は元になるapacheのアクセスログを解凍するのにどの方法が一番早いかを検証する
前提条件
apacheの過去ログは.gzで圧縮されていてストレージサーバーに保存されているものとする
ストレージの構成(圧縮されているファイルのディレクトリ構成)
tree
ストレージ/
└── 日付ディレクトリ
├── WEB01
│ └── access_log.gz
├── WEB02
│ └── access_log.gz
├── WEB03
│ └── access_log.gz
#……これが370台ある
上記で保存されているデータをmongodbに突っ込むのが目的
##一台あたりのapacheログの容量
スマホ用270台とガラケー用100台でそれぞれ容量が異なる
#スマホ用
du -m access_log.gz
34 access_log.gz
#ガラケー用
du -m access_log.gz
10 access_log.gz
###総容量
du -m /path/to/ログストレージ/ | awk '{sum += $1} END {gb = sum / 1024} END {print gb "GB"}'
29.5322GB
おふっ。。。。apacheのログだけで30GBある
実行環境(Amazon EC2)
OS
cat /etc/redhat-release
CentOS release 6.2 (Final)
CPU
cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 45
model name : Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz
stepping : 7
cpu MHz : 1800.001
cache size : 20480 KB
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu de tsc msr pae cx8 cmov pat clflush mmx fxsr sse sse2 ss ht syscall nx lm rep_good unfair_spinlock pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 x2apic popcnt aes hypervisor lahf_lm
bogomips : 3600.00
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
power management:
上記の同様の構成で8コア
メモリ
cat /proc/meminfo
MemTotal: 7130488 kB
#見づらいので
cat /proc/meminfo |grep MemTotal | awk '{sum= $2} END {mb = expr sum / 1024} END {print mb "MB"}'
6963.37MB
約7GBです。
ログ収集するWEBサーバーの台数
370台
検証
一台のWEBサーバーの解凍にかかる時間を計る
time gzip -dc /path/to/ストレージ/日付/サーバー名/access_log.gz > /path/to/展開先のディレクトリ/raw_log/日付/サーバー名/access_log
real 0m9.531s
user 0m2.408s
sys 0m0.551s
1台あたり10秒(四捨五入)かかる計算なので370台だと
(10 * 370) / 60 = 61.6666666667
約62分(約1時間)かかる計算です
CPU数に応じてパイプ処理をして解凍をしてみた
一番最初一気に370台分の子プロセスを積んでやってみたが
やっぱりパフォーマンスが出なかった
#これで370の子プロセスに一気に積んだ (このコマンドを370回ループさせるshellを書いた)
time gzip -dc /path/to/ストレージ/日付/サーバー名/access_log.gz > /path/to/展開先のディレクトリ/raw_log/日付/サーバー名/access_log &
とある人から「CPU数に応じて子プロセスを作れば並列で一番早くできるんじゃあない?」と言われたので試してみた
#これでCPUの数がだせる
cat /proc/cpuinfo | grep processor | wc | awk '{print $1}'
8
#このコマンドをパイプ処理で8個に連結して(370 /8) = 47回ループさせる
time gzip -dc /path/to/ストレージ/日付/サーバー名/access_log.gz > /path/to/展開先のディレクトリ/raw_log/日付/サーバー名/access_log |
結果
370台のログの解凍にかかった時間
real 32m13.975s
user 12m11.686s
sys 2m32.123s
30分弱で解凍できたが理論上の数字と合わない。。。。
#理論上ででるスピード
((47 * 10) / 60) = 7.83333333333 分
メモリが多分追っ付かないのでしょう。。。
解凍したファイルの総容量を調べる
du -m /path/to/展開先のディレクトリ/raw_log/ | awk '{sum += $1} END {gb = sum / 1024} END {print gb "GB"}'
207.183GB
一日でapacheのアクセスログだけで207GBあるんですね。。。
Discussion