https://lwn.net/Articles/383933/
-> 위 article 에 대한 요약
trim 은 나쁜 성능을 가지고 있고, 그것의 대안은 매 ioctl 마다 freed block 을 discard 하지 않는 것이다. 그것을 위해 batched discard 를 만들었다.
성능을 위해 minimum free extent length 를 설정했고, ioctl 은 작은 extents 까지 처리하지 않을 것이다.
이 방식은 성능을 위해서 freed block 을 track 하는 bitmap 을 저장하고, 한꺼번에 trim 하는 것이다.
이것을 구현하기 위해 나는 새로운 bitmap, bb_bitmap_deleted, 을 ext4_group_info 안에 추가 했다.
하나의 문제가 있다. bb_bitmap_deleted 는 umount 때 살아남지 못한다.
문제를 피하기 위해, 첫번째 ioctl 이 모든 call 은 파일 시스템 내의 모든 free extent 를 trim 해야 한다.
밴치마크 결과
people.redhat.com/jmoyer/discard/ext4_batched_discard/
https://lwn.net/Articles/417809/
-> 위 article 에 대한 요약
trim 이나 discard 는 쓸모없어진 storage space 를 driver 에 알려주는 구조이다.
문제는 단지 급하게 처리해야하는 trim 이(online discard 라고도 불린다.) 잘 동작하지 않는 것이다. 몇몇 디바이스에서 이것은 상당히 느리게 동작한다. 과도한 trim 은 자신과 드라이브의 생명을 단축시킨다는 주장도 역시 있다.
대안은 "batch discard" 이다. trim operation은 사용하지 않는 디바이스의 커다란 청크를 single operation으로 marking 하기 위해 사용한다. Batch discard 동작은 filesystem code 로부터 동작될 수 있다. 그들은 user space 로부터 주기적으로 동작한다.
struct fstrim_range {
uint64_t start;
uint64_t len;
uint64_t minlen;
};
FITRIM call 은 파일시스템에게 start 와 start+len-1 사이에 공간을 (사용안함으로 마크하여...) free 하라고 지시한다. 'minlen' byte 보다 작은 extent 는 이 과정중 무시된다. 이 동작은 'start = 0' 'len = ULLONG_MAX' 로 함으로써 전체 디바이스 에 대해서 수행할 수 있다. 이 커맨드는 파일시스템에 의해 구현된다. 따라서 파일시스템에 의해서 free 될 공간이 실제로 trim 된다. 2.6.37에 ext4 는 FITRIM 지원이 생겼다.
'Programming > Linux_Kernel' 카테고리의 다른 글
rootfs (0) | 2018.04.11 |
---|---|
filesystem 잡다한 내용 (0) | 2017.06.13 |
Direct IO 를 위한 aligned buffer 얻기 (0) | 2015.06.29 |
use fallocate in Android system (0) | 2015.04.06 |
linux kernel 이 지원하는 system call list 보기 (0) | 2015.04.06 |