问题描述
我离开了我的一个记录处理程序,在strace下运行了几分钟.
I left a record processing program of mine running for a few minutes under strace.
这表明在那几分钟内有超过2亿次呼叫stat("/etc/localtime",..)
的电话,这听起来有点多余和不必要.
This showed in those minutes over 200 000 000 calls to stat("/etc/localtime",..)
which sounds a bit excessive and unneeded.
strace输出如下:
The strace output looks like this:
write(1, "C137015 393393093052629137110 47"..., 16384) = 16384
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
read(0, "\224q\1\207\0\0\202\1\4\203\1\4\204\1\1\205\1\1\206\1\7\207\1\6\211\1\22\212\1\22\213\1"..., 16384) = 16384
从本质上讲,每个处理的记录实际上都是1 stat()调用,而罪魁祸首就是这条非常普通的代码行
Essentially it turned out to be 1 stat() call for every record processed and the culprit turned out to be this quite ordinary line of code
strftime(call->date_time,DATELEN,"%Y%m%d %H%M%S",&tm_buf);
那么-如何避免在每次调用时strftime()调用stat(/etc/localtime)?
So - how can I avoid strftime() calling stat(/etc/localtime) at every call?
推荐答案
之所以这样做是因为未设置您的时区. strftime
查询/etc/localtime
来找到它.
It might be doing that because your timezone isn't set. strftime
queries /etc/localtime
to find it.
尝试设置TZ
环境变量.
这是有关该行为的链接.
这篇关于如何避免Linux上strftime()中过多的stat(/etc/localtime)调用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!