Linux 7.4 To Close Files Synchronously For close_range, exec & exit
LINUX KERNEL
Christian Brauner는 coredumps를 생성하기 전에 Linux가 파일을 종료하는 방식에 대한 다양한 제안들에서 파생되어, 파일 디스크립터(file descriptors)를 동기적으로 닫기 위해 작업해 왔습니다. 최종적으로 이 기능은 close_range, exec, 그리고 exit 호출 모두에 대해 파일이 동기적으로 닫히도록 합니다.
Brauner는 VFS 풀 리퀘스트에서 다음과 같이 설명했습니다:
"이는 close_range(), exec 및 exit 시 파일을 동기적으로 종료하게 만듭니다. 이는 vfs-7.4-rc1.close_range 태그를 기반으로 하며 이를 포함합니다.
fput()이 task work로 전환되었기 때문에, 종료하는 작업(exiting task)의 모든 최종 __fput()은 task work에 예약되어 exit_task_work()에서 실행됩니다. exec와 close_range()도 마찬가지입니다. 큰 디스크립터 테이블을 가진 작업의 경우 cmpxchg()과 파일당 TIF_NOTIFY_RESUME 테스트-앤-셋(test-and-set) 및 pi_lock 아래 검색할 목록 항목이 있고, 그런 다음 캐시가 더 이상 뜨겁지 않은 모든 struct file에 대한 두 번째 패스가 있습니다. Oleg와 Neil은 수년 동안 이 점을 지적해 왔습니다.
close_files(), close_range() 및 close-on-exec는 이제 각 파일을 close(2)가 하는 방식대로 플러시하고 인라인으로 넣습니다. 커널 스레드는 영향을 받지 않습니다."
다양한 수의 파일 디스크립터(FDs)가 FD 테이블의 무작위 위치에 흩어져 있는 AMD EPYC 서버에서 실행되는 64 vCPU KVM 게스트 환경에서, 이 패치들은 파일을 닫는 데 걸리는 시간을 매우 크게 줄여줍니다:
Brauner는 풀 리퀘스트에 다음과 같이 추가했습니다:
"따라서 이는 16-21% 또는 파일당 40-150 ns이며, 디스크립터가 1M일 때 가장 큽니다. 각 프로세스가 한 번에 65536개의 디스크립터를 해체하는 8개 프로세스의 경우, 캐시를 위해 CPU들이 경쟁할 때 비용이 많이 드는 16 MB의 struct file에 대한 두 번째 패스 때문에 여전히 16-21%로 유지됩니다. 32개 또는 64개 프로세스의 경우, 두 커널 모두 slab과 rcu를 통해 수백만 개의 파일을 밀어내는 데 의해 제한되며 차이는 4-8%로 줄어듭니다. 자체 해제가 지배적인 파일은 이득이 적어 eventfds의 경우 13%, 파이프(pipes)의 경우 11%, AF_UNIX 소켓의 경우 6%입니다. close(2)는 건드리지 않았으며, will-it-scale은 2% 이내입니다."
현재 개발 중인 Linux 7.4 커널에 포함된 여러 유용한 개선 사항 중 하나입니다. Linux 7.4 안정 버전은 12월 말경 출시될 예정입니다.