2010-12-29 2 views
19

Ich habe ein Aufnahmeprogramm von mir für einige Minuten unter strace laufen lassen.Wie vermeidet man übermäßige stat (/ etc/localtime) Aufrufe in Strftime() auf Linux?

Dies zeigte in diesen Minuten über 200 000 000 Anrufe an stat("/etc/localtime",..), die ein wenig übertrieben und nicht benötigt klingt.

Die Strace Ausgabe sieht wie folgt aus:

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 

Wesentlichen 1 stat() Aufruf sein, es stellte sich heraus, für jeden Datensatz verarbeitet und der Täter stellte sich heraus, das ganz gewöhnliche Codezeile sein

strftime(call->date_time,DATELEN,"%Y%m%d %H%M%S",&tm_buf); 

So - wie kann ich vermeiden, strftime() Aufruf stat (/ etc/localtime) bei jedem Anruf?

+4

Haben Sie irgendwelche Beweise dafür, dass dies tatsächlich ein messbares Problem verursacht (d. H. Erhebliche Laufzeitkosten, die von einem Profiler gemessen werden)? Sie sollten nicht versuchen, basierend auf * Gefühle * (wie "klingt ein bisschen übertrieben") zu optimieren. Nimm Messungen und nutze Fakten. –

+2

+1 für die Frage, wie glibc aufgebläht werden kann. :-) –

+0

Das Hinzufügen von 'export TZ =:/etc/localtime' zu ​​meinem Shell-Skript hat die wiederholten syscalls für mich eliminiert. – shuckc

Antwort

20

Es könnte sein, weil Ihre Zeitzone nicht festgelegt ist. strftime Abfragen /etc/localtime um es zu finden.

Versuchen Sie, die Umgebungsvariable TZ einzustellen.

Hier ist a link for that behavior.

+1

Einstellung TZ = ":/etc/localtime" "repariert" dies. Auf dieser Seite steht jedoch auch: "Sie sollten TZ normalerweise nicht setzen müssen" – nos

+1

@nos * In der GNU C-Bibliothek entspricht die Standardzeitzone der Spezifikation 'TZ =:/etc/localtime' [...] *. Es gibt die Quelle der wiederholten 'stat'-Aufrufe. –

+0

Ich bin nicht sicher, dass die stat() - Aufrufe erklärt, wenn ich TZ =:/etc/localtime explizit festlegen, verschwinden die stat() - Aufrufe. – nos

Verwandte Themen