2012-01-16 27 views
7

Tôi có một chương trình thử nghiệm. Nó mất khoảng 37 giây trên hạt nhân Linux 3.1. *, Nhưng chỉ mất khoảng 1 giây trên hạt nhân 3.0.18 (tôi chỉ cần thay thế hạt nhân trên cùng một máy như trước). Xin vui lòng cho tôi một đầu mối về cách cải thiện nó trên hạt nhân 3.1. Cảm ơn!Tại sao fsync() mất nhiều thời gian hơn trên hạt nhân Linux 3.1. * So với kernel 3.0

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 


int my_fsync(int fd) 
{ 
    // return fdatasync(fd); 
    return fsync(fd); 
} 


int main(int argc, char **argv) 
{ 
    int rc = 0; 
    int count; 
    int i; 
    char oldpath[1024]; 
    char newpath[1024]; 
    char *writebuffer = calloc(1024, 1); 

    snprintf(oldpath, sizeof(oldpath), "./%s", "foo"); 
    snprintf(newpath, sizeof(newpath), "./%s", "foo.new"); 

    for (count = 0; count < 1000; ++count) { 
    int fd = open(newpath, O_CREAT | O_TRUNC | O_WRONLY, S_IRWXU); 
    if (fd == -1) { 
     fprintf(stderr, "open error! path: %s\n", newpath); 
     exit(1); 
    } 

    for (i = 0; i < 10; i++) { 
     rc = write(fd, writebuffer, 1024); 
     if (rc != 1024) { 
     fprintf(stderr, "underwrite!\n"); 
     exit(1); 
     } 
    } 

    if (my_fsync(fd)) { 
     perror("fsync failed!\n"); 
     exit(1); 
    } 

    if (close(fd)) { 
     perror("close failed!\n"); 
     exit(1); 
    } 

    if (rename(newpath, oldpath)) { 
     perror("rename failed!\n"); 
     exit(1); 
    } 

    } 

    return 0; 
} 


# strace -c ./testfsync 
% time  seconds usecs/call  calls errors syscall 
------ ----------- ----------- --------- --------- ---------------- 
98.58 0.068004   68  1000   fsync 
    0.84 0.000577   0  10001   write 
    0.40 0.000275   0  1000   rename 
    0.19 0.000129   0  1003   open 
    0.00 0.000000   0   1   read 
    0.00 0.000000   0  1003   close 
    0.00 0.000000   0   1   execve 
    0.00 0.000000   0   1   1 access 
    0.00 0.000000   0   3   brk 
    0.00 0.000000   0   1   munmap 
    0.00 0.000000   0   2   setitimer 
    0.00 0.000000   0  68   sigreturn 
    0.00 0.000000   0   1   uname 
    0.00 0.000000   0   1   mprotect 
    0.00 0.000000   0   2   writev 
    0.00 0.000000   0   2   rt_sigaction 
    0.00 0.000000   0   6   mmap2 
    0.00 0.000000   0   2   fstat64 
    0.00 0.000000   0   1   set_thread_area 
------ ----------- ----------- --------- --------- ---------------- 
100.00 0.068985     14099   1 total 
+0

Làm thế nào để bạn biết đó là fsync() gây ra sự chậm lại? Có thể là cuộc gọi mở(). –

+0

Tùy chọn 'mount' nào bạn đang sử dụng trên hệ thống tập tin được đề cập? (Ngẫu nhiên, nó mất khoảng 1,5 giây trên hạt nhân 2.6.38-12-generic của tôi từ Ubuntu; hệ thống tập tin 'ext3',' rw, lỗi = remount-ro, commit = 0'.) – sarnold

+0

'strace -c ./a. out' sẽ tóm tắt thời gian thực hiện của các cuộc gọi hệ thống khác nhau. – sarnold

Trả lời

8

Hạt nhân 3.1. * Thực sự đang thực hiện đồng bộ hóa, 3.0.18 là giả mạo. Mã của bạn không ghi 1.000 đồng bộ. Vì bạn cắt bớt tệp, mỗi ghi cũng mở rộng tệp. Vì vậy, bạn thực sự có 2.000 hoạt động viết. Độ trễ ghi ổ cứng điển hình là khoảng 20 mili giây trên I/O. Vì vậy, 2.000 * 20 = 40.000 mili giây hoặc 40 giây. Vì vậy, nó có vẻ đúng, giả sử bạn đang viết cho một ổ đĩa cứng điển hình.

Về cơ bản, bằng cách đồng bộ sau mỗi lần ghi, bạn cung cấp cho hạt nhân không có khả năng lưu trữ hiệu quả hoặc chồng chéo ghi và buộc hành vi xấu nhất trên mọi thao tác. Ngoài ra, ổ đĩa cứng gió lên phải tìm kiếm qua lại giữa nơi dữ liệu được viết và nơi siêu dữ liệu được viết một lần cho mỗi lần viết.

2

Tìm thấy lý do. Các rào cản hệ thống tệp được bật theo mặc định trong ext3 cho hạt nhân Linux 3.1 (http://kernelnewbies.org/Linux_3.1). Sau khi vô hiệu hóa các rào cản, nó trở nên nhanh hơn nhiều.

+0

Bạn cũng có thể đang gây ra sự cố về hiệu suất vì mẫu I/O không bình thường trong thử nghiệm của bạn. Hãy thử 1000 tệp khác nhau, ví dụ, có thể xen kẽ với lần đọc. Tôi không chắc chắn vô hiệu hóa rào cản fs là một giải pháp tốt, nếu bạn đang trong thực tế tìm kiếm lưu giữ dữ liệu an toàn hơn (vì thiếu một thuật ngữ tốt hơn). – ergosys

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