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
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ở(). –
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
'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