2010-12-29 19 views
19

Tôi để lại một chương trình xử lý hồ sơ của tôi chạy trong vài phút dưới strace.Làm thế nào để tránh các lệnh stat quá mức (/ etc/localtime) trong strftime() trên linux?

Điều này thể hiện trong những phút đó trên 200 000 000 cuộc gọi đến stat("/etc/localtime",..) có vẻ hơi quá mức và không cần thiết.

Sản lượng strace trông như thế này:

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 

Về cơ bản nó bật ra được 1 stat() gọi cho tất cả các kỷ lục xử lý và thủ phạm hóa ra là dòng này khá bình thường mã

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

Vậy - làm thế nào tôi có thể tránh strftime() gọi stat (/ etc/localtime) tại mọi cuộc gọi?

+4

Bạn có bất kỳ bằng chứng nào cho thấy điều này thực sự gây ra một vấn đề có thể đo lường (tức là chi phí thời gian chạy đáng kể được đo bởi một hồ sơ) không? Bạn không nên cố gắng tối ưu hóa dựa trên * cảm xúc * (như "âm thanh hơi quá mức"). Nhận số đo và sử dụng sự kiện. –

+2

+1 cho câu hỏi về việc nhận được dưới cùng của bloib glibc. :-) –

+0

Việc thêm 'xuất TZ =:/etc/localtime' vào tập lệnh shell của tôi đã loại bỏ các syscalls lặp lại cho tôi. – shuckc

Trả lời

20

Có thể là do múi giờ của bạn chưa được đặt. strftime truy vấn /etc/localtime để tìm kiếm.

Thử đặt biến môi trường TZ.

Đây là a link for that behavior.

+1

cài đặt TZ = ":/etc/localtime" hiện "khắc phục" điều này. Tuy nhiên trang đó cũng nói "Bạn không nên bình thường cần đặt TZ" – nos

+1

@nos * Trong thư viện GNU C, múi giờ mặc định giống như đặc tả 'TZ =:/etc/localtime' [...] *. Có nguồn của các cuộc gọi 'stat' lặp lại. –

+0

Im không chắc chắn rằng giải thích các cuộc gọi stat(), nếu tôi explicittly đặt TZ =:/etc/localtime, các cuộc gọi stat() biến mất. – nos

Các vấn đề liên quan