Python(Stackless) + MongoDB Apache 日誌(2G)分析

爲何選擇Stackless?   http://www.stackless.com

Stackless可以簡單的認爲是Python一個增強版,最吸引眼球的非“微線程”莫屬。微線程是輕量級的線程,與線程相比切換消耗的資源更小,線程內共享數據更加便捷。相比多線程代碼更加簡潔和可讀。此項目是由EVE Online推出,在併發和性能上確實很強勁。安裝和Python一樣,可以考慮替換原系統Python。:)

爲何選擇MongoDB?   http://www.mongodb.org

可以在官網看到很多流行的應用採用MongoDB,比如sourceforge,github等。相比RDBMS有啥優勢?首先在速度和性能上優勢最爲明顯,不僅可以當作類似KeyValue數據庫來使,還包含了一些數據庫查詢(Distinct、Group、隨機、索引等特性)。再有一點特性就是:簡單。不論是應用還是文檔,還是第三方API,幾乎略過一下就可以使用。不過有點遺憾的就是,存儲的數據文件很大,超過正常數據的2-4倍之間。本文測試的Apache日誌大小是2G,生產的數據文件有6G。寒…希望在新版裏能有所縮身,當然這個也是明顯的以空間換速度的後果。

本文除去上面提及到的兩個軟件,還需要安裝pymongo模塊。http://api.mongodb.org/python/

模塊安裝方式有源碼編譯和easy_install,這裏就不再累贅。

1. 從Apache日誌中分析出需要保存的資料,比如IP,時間,GET/POST,返回狀態碼等。

fmt_str  = '(?P<ip>[./d]+) - - /[(?P<time>.*?)/] "(?P<method>.*?) (?P<uri>.*?) HTTP/1./d" (?P<status>/d+) (?P<length>.*?) "(?P<referere>.*?)" "(?P<agent>.*?)"'
fmt_name = re.findall('/?P<(.*?)>', fmt_str)
fmt_re = re.compile(fmt_str)

定義了一個正則用於提取每行日誌的內容。fmt_name就是提取尖括號中間的變量名。

2. 定義MongoDB相關變量,包括需要存到collection名稱。Connection採取的是默認Host和端口。

conn     = Connection()
apache = conn.apache
logs = apache.logs

3. 保存日誌行

def make_line(line):
m = fmt_re.search(line)
if m:
logs.insert(dict(zip(fmt_name, m.groups())))

4. 讀取Apache日誌文件

def make_log(log_path):
with open(log_path) as fp:
for line in fp:
make_line(line.strip())

5. 運行把。

if __name__ == '__main__':
make_log('d:/apachelog.txt')

腳本大致情況如此,這裏沒有放上stackless部分代碼,可以參考下面代碼:

import stackless
def print_x(x):
print x
stackless.tasklet(print_x)('one')
stackless.tasklet(print_x)('two')
stackless.run()

tasklet操作只是把類似操作放入隊列中,run纔是真正的運行。這裏主要用於替換原有多線程threading並行分析多個日誌的行爲。

補充:

Apache日誌大小是2G,671萬行左右。生成的數據庫有6G。

硬件:Intel(R) Core(TM)2 Duo CPU E7500 @ 2.93GHz 臺式機

系統:RHEL 5.2 文件系統ext3

其他:Stackless 2.6.4 MongoDB 1.2

在保存300萬左右時候,一切正常。不管是CPU還是內存,以及插入速度都很不錯,大概有8-9000條/秒。和以前筆記本上測試結果基本一致。再往以後,內存消耗有點飆升,插入速度也降低。500萬左右記錄時候CPU達到40%,內存消耗2.1G。在生成第二個2G數據文件時候似乎速度和效率又提升上去了。最終保存的結果不是太滿意。

後加用筆記本重新測試了一下1000萬數據,速度比上面的671萬明顯提升很多。初步懷疑有兩個地方可能會影響性能和速度:

1. 文件系統的差異。筆記本是Ubuntu 9.10,ext4系統。搜了下ext3和ext4在大文件讀寫上會有所差距。

2. 正則匹配上。單行操作都是匹配提取。大文件上應該還有優化的空間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章