Abbiamo un codice che vuole chiamare lo localtime
molto spesso da più thread. (Sfondo pertinente: è un server in cui una delle cose che puoi chiedere è l'ora locale come stringa, e vuole essere in grado di servire 100Ks di richieste al secondo.)API Linux/crossplatform per le regole del fuso orario? (sostituire il blocco localtime_r)
Abbiamo scoperto che su Ubuntu Linux 12.04, la funzione di glibc localtime_r
("localtime rientrante") chiama __tz_convert
, che still takes a global lock!
(Inoltre, sembra che FreeBSD rende localtime_r
chiamata tzset
su ogni singola chiamata, perché sono paranoico che il programma avrebbe potuto fare un setenv("TZ")
e/o l'utente ha scaricato una nuova versione di /etc/localtime
da ora e l'ultima volta è stato chiamato localtime_r
(questo è l'opposto del sit descrizione descritta here; sembra che glibc chiama tzset
on every invocation of localtime
but not localtime_r
, solo per essere fonte di confusione.)
Ovviamente, questo è terribile per le prestazioni. Per i nostri scopi, vorremmo fondamentalmente "scattare" le regole per il nostro fuso orario corrente quando il server inizia a funzionare, e quindi usare quella istantanea per sempre. Quindi continueremo a rispettare le regole di Daylight Savings Time (perché le regole per quando passare a DST farebbero parte dello snapshot), ma non verremmo mai tornare sul disco, prendere mutex o fare qualsiasi altra cosa che causerebbe thread bloccare. (Non stiamo rispettando gli aggiornamenti scaricati su tzinfo e non rispettando le modifiche allo /etc/localtime
, non ci aspettiamo che il server cambi fisicamente i fusi orari mentre è in esecuzione.)
Tuttavia, non riesco a trovare alcuna informazione online su come per gestire le regole del fuso orario - se esiste un'API userspace per lavorare con loro, o se saremo costretti a reimplementare alcune centinaia di righe di codice glibc per leggere da soli i dati del fuso orario.
Dobbiamo reimplementare tutto a valle di __tz_convert
- incluso tzfile_read
, poiché non sembra essere esposto agli utenti? O c'è qualche interfaccia POSIX e/o libreria di terze parti che potremmo usare per lavorare con le regole del fuso orario?
(ho visto http://www.iana.org/time-zones/repository/tz-link.html ma non sono sicuro che sia utile.)
Non è affatto ovvio che il blocco globale in 'tzset' è" terribile per le prestazioni "- lo hai effettivamente confrontato? A meno che non ti piaccia, sembra essere il caso della proverbiale ottimizzazione prematura. Per quanto ne so, 'tzset' ha un percorso veloce che sostanzialmente non fa nulla se il fuso orario non è effettivamente cambiato. In un'applicazione reale mi aspetterei che il blocco non venga mai discusso. – user4815162342
Il blocco viene discusso ogni volta che due thread chiamano '__tz_convert' in una volta; controlla il codice E sì, l'unica ragione per cui sappiamo che questo blocco esiste è che abbiamo visto che si trattava di un collo di bottiglia nei test di perf (test specifici che servivano molte richieste locali). – Quuxplusone
Hai guardato [Boost] (http://www.boost.org/doc/libs/1_54_0/doc/html/date_time.html) o [ICU] (http://userguide.icu-project.org/ appuntamento)? –