😀

webサーバーaccessログ収集メモ[過去データ収集編]

2022/11/28に公開

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