python的日志logging模块性能以及多进程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenggong2dm/article/details/52094410

写在前面:

    日志是记录操作的一种好方式。但是日志,基本都是基于文件的,也就是要写到磁盘上的。这时候,磁盘将会成为一个性能瓶颈。对于普通的服务器硬盘(机械磁盘,非固态硬盘),python日志的性能瓶颈是多少呢?今天我们就来测一下。


    测试代码如下:

#! /usr/bin/env python
#coding=utf-8

# ============================
# Describe :    给平台提供的日志
# D&P Author By:        常成功
# Create Date:     2016/08/01
# Modify Date:     2016/08/01
# ============================

import time
import os
import logging


print "Start test ...."
s_tm = time.time()
test_time = 10.0   # 测试时间10秒
e_tm = s_tm + 10
j = 0

pid = str(os.getpid())
while 1:
    now_time = time.time()
    j += 1
    if now_time > e_tm:
        break
    # 生成文件夹
    lujing = "d:\\test_log"
    if not os.path.exists(lujing):
        os.mkdir(lujing)

    fm2 = '%Y%m%d'
    YMD = time.strftime(fm2, time.localtime(now_time))

    filename = 'recharge_' + YMD + '.log'
    log_file = os.path.join(lujing, filename)
    t = "\t"
    log_msg = str(j) +t+ str(now_time) +t+ pid

    the_logger = logging.getLogger('recharge_log')
    f_handler = logging.FileHandler(log_file)
    the_logger.addHandler(f_handler)
    the_logger.setLevel(logging.INFO)
    # To pass exception information, use the keyword argument exc_info with a true value
    the_logger.info(log_msg, exc_info=False)
    the_logger.removeHandler(f_handler)

rps = j/test_time
print rps, "rows per second"

结果为:

Start test ....
2973.0 rows per second


Python的logging性能:

7200转的机械磁盘,测了几次,每秒的能写入日志的行数(每行就是一条日志),数量基本在 2800-3000 之间。此时,磁盘IO基本已经跑满。(在3.3Ghz的CPU上,CPU占用大约40%)。


Python的logging多进程:

Python 的 logging模块,是线程安全的。但对于多进程的程序来说,怎么去写日志文件呢?我的解决办法是,每个进程的PID,写一个单独的日志文件。再用算法把所有进程的日志合并起来,生成新的日志。

提示:由于磁盘IO已经到达瓶颈,所以多进程并不能提高日志性能。高性能日志,需要用缓存,或者分布式日志。




阅读更多

没有更多推荐了,返回首页