我正在使用以下Bash命令模式运行memcached:
memcached -vv 2>&1 | tee memkeywatch2010098.log 2>&1 | ~/bin/memtracer.py | tee memkeywatchCounts20100908.log
尝试追踪平台范围内键的未匹配的get和set。
下面是memtracer脚本,它按预期工作,只有一个小问题。观察中间日志文件的大小,memtracer.py直到memkeywatchYMD.log大小约为15-18K时才开始获取输入。是否有更好的方法来读取标准输入,或者可以将缓冲区大小缩小到不到1k以提高响应时间?
#!/usr/bin/python
import sys
from collections import defaultdict
if __name__ == "__main__":
keys = defaultdict(int)
GET = 1
SET = 2
CLIENT = 1
SERVER = 2
#if <
for line in sys.stdin:
key = None
components = line.strip().split(" ")
#newConn = components[0][1:3]
direction = CLIENT if components[0].startswith("<") else SERVER
#if lastConn != newConn:
# lastConn = newConn
if direction == CLIENT:
command = SET if components[1] == "set" else GET
key = components[2]
if command == SET:
keys[key] -= 1
elif direction == SERVER:
command = components[1]
if command == "sending":
key = components[3]
keys[key] += 1
if key != None:
print "%s:%s" % ( key, keys[key], )
stdin
。现在,只有stdout
和stderr
受-u
选项影响。 - Martijn Pietersos.fdopen(sys.stdin.fileno(), 'rb', buffering=0)
。 - Denilson Sá Maiasys.stdin
实际上有三层;一个io.TextIOWrapper
(将bytes
解码为str
)包装了一个io.BufferedReader
(缓冲bytes
)包装了一个io.FileIO
(提交系统调用的实际事物)。它们都可以作为属性使用;sys.stdin.buffer
获取未进行文本解码的BufferedReader
,sys.stding.buffer.raw
获取未缓冲的FileIO
。 - ShadowRanger