특정 디스크 블록이 한번이라도 쓰여진(written) 적이 있다면 SSD 컨트롤러는 해당 블록을 사용중(in use)으로 인식합니다. 아무리 여유 공간이 많더라도 어느 순간에는 모든 블록이 사용중이며 접근할 수 없는 (in use and unavailable) 상태가 되며, 일부 블록에만 계속해서 덮어쓰기가 발생하여 SSD의 쓰기 성능과 수명에 악영향을 끼칩니다.
trim을 실행하면 커널은 현재 사용되지 않는 블록의 목록을 SSD 컨트롤러에게 전달하며, 컨트롤러는 이 블록을 페이지로 집계하여 제로필(zero-filling)합니다.
zpool status -t [ pool 이름 ]
현재 pool 상태를 조회합니다.
해당 pool에서 trim이 실행된 적이 없다면 untrimmed가 출력됩니다.
zpool trim [ pool 이름 ]
수동으로 trim을 실행합니다.
해당 pool 상태를 조회하면 위 사진과 같이 trim 진행상황을 알 수 있습니다.
zpool set autotrim=on [ pool 이름 ]
자동 trim은 비활성화되어 있으나 위와 같이 활성화할 수 있습니다.
자동 trim을 사용할 경우 적은 수의 디스크 블록을 자주 관리해야 하므로 SSD 컨트롤러에 부담이 됩니다. 특히 swap 메모리와 같이 잦은 빈도로 I/O가 발생하는 경우 오히려 상당한 성능 저하가 발생할 수 있습니다.
그러므로 정기적인 수동 trim이 권장됩니다. 수동 trim을 cron job으로 등록하여 매주 특정 요일에 실행하는 방법을 고려해볼 수 있습니다.
0 4 * * 0 /sbin/zpool trim rpool
(매주 일요일 새벽 4시에 trim을 실행하는 예시)