Linux에서 임시 파일 생성 속도 향상

Linux에서 임시 파일 생성 속도 향상

나는 자주 사용하는 Linux 응용 프로그램을 가지고 있는데 작업하는 동안 많은 임시 파일을 만드는 것을 좋아합니다. 기본적으로 해당 소프트웨어는 보드를 자동으로 라우팅하며 라우팅 프로세스 중에 수많은 임시 파일을 생성하고 삭제합니다.

open 명령을 스캔할 때 내 strace 출력은 다음과 같습니다.

  12:09:52.677525 open("/tmp/e000134A.tmp", O_RDWR|O_CREAT|O_APPEND, 0666) = 8
  12:09:52.677777 open("/tmp/e000134A.tmp", O_RDWR|O_CREAT|O_TRUNC, 0666) = 8
  12:09:52.871198 open("/tmp/e000134B.tmp", O_RDWR|O_CREAT|O_APPEND, 0666) = 8
  12:09:52.871342 open("/tmp/e000134B.tmp", O_RDWR|O_CREAT|O_TRUNC, 0666) = 8
  12:09:53.092441 open("/tmp/e000134C.tmp", O_RDWR|O_CREAT|O_APPEND, 0666) = 8
  12:09:53.092563 open("/tmp/e000134C.tmp", O_RDWR|O_CREAT|O_TRUNC, 0666) = 8
  12:09:53.292663 open("/tmp/e000134D.tmp", O_RDWR|O_CREAT|O_APPEND, 0666) = 8
  12:09:53.292779 open("/tmp/e000134D.tmp", O_RDWR|O_CREAT|O_TRUNC, 0666) = 8
  12:09:53.452220 open("/tmp/e000134E.tmp", O_RDWR|O_CREAT|O_APPEND, 0666) = 8
  12:09:53.452310 open("/tmp/e000134E.tmp", O_RDWR|O_CREAT|O_TRUNC, 0666) = 8
  12:09:53.630176 open("/tmp/e000134F.tmp", O_RDWR|O_CREAT|O_APPEND, 0666) = 8
  12:09:53.630275 open("/tmp/e000134F.tmp", O_RDWR|O_CREAT|O_TRUNC, 0666) = 8
  12:09:53.797461 open("/tmp/e0001350.tmp", O_RDWR|O_CREAT|O_APPEND, 0666) = 8
  12:09:53.797566 open("/tmp/e0001350.tmp", O_RDWR|O_CREAT|O_TRUNC, 0666) = 8
  12:09:53.968627 open("/tmp/e0001351.tmp", O_RDWR|O_CREAT|O_APPEND, 0666) = 8
  12:09:53.968727 open("/tmp/e0001351.tmp", O_RDWR|O_CREAT|O_TRUNC, 0666) = 8
  12:09:54.145310 open("/tmp/e0001352.tmp", O_RDWR|O_CREAT|O_APPEND, 0666) = 8
  12:09:54.145417 open("/tmp/e0001352.tmp", O_RDWR|O_CREAT|O_TRUNC, 0666) = 8

그리고 내가 멈출 때까지 통화가 계속 반복됩니다.

임시 폴더에 생성된 파일 중 하나가 약 90K인 것을 확인했지만 대부분 0바이트였습니다.

나는 다음과 같이 작업 속도를 높이려고 노력했습니다.

더 큰 메모리 드라이브를 허용하도록 부팅 매개변수를 조정한 다음 /tmp 폴더가 필요한 항목을 부팅하기 전에 다음 두 줄을 추가했습니다.

mke2fs -cc -b 1024 -m 0 /dev/ram0 50000
mount -o async,nodev,noatime,nodiratime,noiversion,nomand,norelatime /dev/ram0 /tmp

또한 ionice를 사용하여 애플리케이션을 실행했습니다.

ionice -c1 -n0 appname

생성부터 삭제까지 임시 파일을 처리하는 방법에 대한 자세한 내용은 다음과 같습니다.

  12:17:02.905620 stat64("/tmp/", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=1024, ...}) = 0
  12:17:02.905719 access("/tmp/", R_OK|W_OK|X_OK) = 0
  12:17:02.905782 open("/tmp/e0001C6D.tmp", O_RDWR|O_CREAT|O_APPEND, 0666) = 8
  12:17:02.905851 close(8)                = 0
  12:17:02.905886 open("/tmp/e0001C6D.tmp", O_RDWR|O_CREAT|O_TRUNC, 0666) = 8
  12:17:02.905933 fstat64(8, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
  12:17:02.905994 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7c5c000
  12:17:02.906044 write(8, "\1\0\224\10\30\206\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
  12:17:02.906117 write(8, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 63488) = 63488
  12:17:02.906305 write(8, "@\0\221\0\221\0\221\0\221\0\221\0\263\0\263\0\263\0\242\0\263\0\263\0\263\0Q\0Q\0b\0Q"..., 1024) = 1024
  12:17:02.906361 write(8, "Q\0Q\0\242\0b\0\21\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 33792) = 33792
  12:17:02.924577 gettimeofday({1519233422, 924592}, NULL) = 0
  12:17:02.935856 gettimeofday({1519233422, 935870}, NULL) = 0
  12:17:02.947417 gettimeofday({1519233422, 947430}, NULL) = 0
  12:17:02.947453 write(8, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 544) = 544
  12:17:02.947523 _llseek(8, 0, [0], SEEK_SET) = 0
  12:17:02.947558 read(8, "\1\0\224\10\30\206\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
  12:17:02.947616 read(8, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 63488) = 63488
  12:17:02.947727 read(8, "@\0\221\0\221\0\221\0\221\0\221\0\263\0\263\0\263\0\242\0\263\0\263\0\263\0Q\0Q\0b\0Q"..., 1024) = 1024
  12:17:02.947781 read(8, "Q\0Q\0\242\0b\0\21\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 33792) = 33792
  12:17:02.947864 read(8, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 544
  12:17:02.948680 close(8)                = 0
  12:17:02.948713 munmap(0xb7c5c000, 4096) = 0
  12:17:02.948751 unlink("/tmp/e0001C6D.tmp") = 0

그렇다면 이러한 호출을 줄이거나 속도를 높이는 방법이 있습니까?

답변1

RAM 지원 ext2 파일 시스템은 ramfs 또는 tmpfs보다 훨씬 덜 효율적입니다. 이것이 커널이 initrd에서 initramfs로 전환된 이유 중 하나입니다. /tmp 마운트 지점을 tmpfs로 바꿔보세요.

관련 정보