TRIM

**트림 명령**(ATA 커맨드에서는 **TRIM**, SCSI 커맨드에서는 **UNMAP**이라고 함)을 사용하면 운영 체제에서 데이터 블록을 더 이상 사용하지 않는다는 것을 솔리드 스테이트 드라이브 (SSD)에 알릴 수 있으므로 내부적으로 데이터를 지우는 것이 가능하다.

TRIM은 SSD가 처음으로 고안된 직후에 도입되었다. SSD가 수행하는 낮은 수준의 작업은 하드 드라이브와 크게 다르기 때문에 운영 체제가 삭제 및 포맷과 같은 작업을 수행하는 일반적인 방식은 예상과는 달리 SSD의 기록 성능이 점진적으로 저하되었다. TRIM을 수행하면 SSD는 가비지 컬렉션을 보다 효율적으로 처리할 수 있다. 그렇지 않다면 향후 관련 블록에 대한 기록 동작이 느려질 수 있다.

TRIM이 도입되기 전에도 이미 일부 드라이브를 초기 상태로 "재설정"하는 도구를 사용할 수 있었지만 드라이브의 모든 데이터를 삭제하기 때문에 최적화 상태를 지속하기에는 실용적이지 않았다. 2014년까지 많은 SSD는 TRIM과 독립적으로 작동하는 내부적인 가비지 컬렉션 메커니즘을 가지고 있었다. 이 매커니즘은 트림을 지원하지 않은 운영 체제에서 성공적으로 성능을 유지했지만, 쓰기 증폭(WAF)의 증가와 플래시 셀의 마모와 연관된 단점이 있었다.

TRIM은 SMR(Shingled Magnetic Recording) 하드 드라이브에도 널리 사용된다.

## 배경
많은 파일 시스템이 데이터 블록을 "사용하지 않음"으로 표시해 두는 방식으로 삭제 작업을 처리하기 때문에 저장 미디어(SSD와 기존 하드 드라이브)는 일반적으로 어떤 섹터/페이지가 실제로 사용되고 비어있는지 알지 못한다. 예를 들어 덮어쓰기 작업과 달리 삭제 작업을 할 때는 데이터를 포함하고 있는 섹터를 물리적으로 쓰는 과정이 수반되지 않는다. 일반 SSD는 사용되지않은 블록/섹터 목록을 포함하여 파일 시스템 구조에 대한 정보가 없기 때문에 저장 매체는 블록을 사용할 수 있게 되었다는 사실을 알지 못한다. 이것은 운영 체제에서 파일이 "삭제됨"으로 보고 되었음에도 불구하고 종종 삭제 취소 도구를 사용하여 전자 기계식 하드 디스크에서 파일을 복구할 수 있도록 한다. 이는 또한 운영 체제가 나중에 여유 공간으로 간주되는 섹터 중의 하나에 기록 작업을 수행할 때 저장 매체의 관점에서 효과적인 덮어 쓰기 작업이 된다는 것을 의미한다. 자기 디스크의 경우 기존 데이터 덮어쓰기는 빈 섹터에 쓰는 것과 같지만, 일부 SSD가 가장 낮은 수준에서 작동하기 때문에 덮어쓰기는 데이터를 빈 페이지에 쓰는 것과 비교하여 상당한 오버헤드가 발생하여 잠재적으로 쓰기 성능을 저하시킨다.

SSD는 일반적으로 4~16kiB의 페이지로 그룹화되고 128~512페이지의 블록으로 그룹화되는 플래시 메모리 셀에 데이터를 저장한다. 예: 512 kiB 블록은 각각 4 kiB의 128 페이지를 그룹화한다. NAND 플래시 메모리 셀은 비어 있는 경우에만 직접 쓸 수 있다. 데이터가 포함된 경우 기록 작업 전에 내용을 지워야 한다. SSD 쓰기 작업은 단일 페이지에 수행할 수 있지만 하드웨어 의 제약으로 인해 지우기 명령은 항상 전체 블록에 영향을 준다. 결과적으로 SSD의 빈 페이지에 데이터를 쓰는 것은 매우 빠르지만 이전에 쓴 페이지를 덮어써야 한다면 속도가 상당히 느려진다. 다시 쓰기 전에 페이지의 셀을 지워야 하지만 전체 블록만 지울 수 있으므로 덮어쓰기는 읽기-지우기-수정-쓰기 주기로 동작한다. 내용 전체 블록이 캐시에 저장된 다음 전체 블록이 SSD에서 지워지고 덮어쓴 페이지가 캐시된 블록에 기록되고 그런 다음에만 전체 업데이트된 블록이 플래시 매체에 기록될 수 있다. 이 현상을 쓰기 증폭이라고 한다.

## 작업
TRIM 명령을 사용하면 운영 체제는 더 이상 유효한 데이터를 포함하지 않는 페이지를 SSD에 알릴 수 있다. 파일 삭제 작업의 경우 운영 체제는 파일의 섹터를 새 데이터를 위한 여유 공간이라 표기한 다음 TRIM 명령을 SSD로 보낸다. TRIM이후 SSD는 플래시 메모리 페이지에 새 데이터를 쓸 때 블록의 내용을 보존하지 않으므로 쓰기 증폭이 줄어들고(쓰기 횟수 감소) 쓰기 처리량이 높아진다(읽기-지우기-수정 시퀀스가 필요 없음). 따라서 드라이브 수명이 증가한다.

SSD마다 명령을 약간 다르게 실행하기 때문에 성능은 다를 수 있다.

TRIM은 SSD에 LBA 영역을 유효하지 않은 것으로 표시하도록 지시하고 해당 영역에 대한 후속 읽기는 의미 있는 데이터를 반환하지 않는다. 아주 짧은 시간 동안 데이터는 여전히 내부적으로 플래시에 머무를 수 있다. 그러나 TRIM 명령이 실행되고 가비지 수집이 수행된 후에는 데이터를 복구할 수 있을 가능성은 거의 없다.

## 실행
### 운영 체제 지원
TRIM 명령은 드라이브에서 수행하고 운영 체제에서 요청하는 경우에만 유용하다. 아래 표는 각 주목할만한 운영 체제와 명령을 지원하는 첫 번째 버전을 나타낸다. 또한 ATA 표준에 TRIM 명령을 추가하기 전에 설계된 이전 솔리드 스테이트 드라이브에는 펌웨어 업데이트가 필요하다. 그렇지 않으면 새로 내리는 명령이 무시된다. 하지만 TRIM을 지원하도록 모든 드라이브를 업그레이드할 수 있는 것은 아니다.

TRIM 기능의 지원은 운영 체제의 특정 파일 시스템 드라이버가 수행할 수 있는 기능에 따라 달라진다. 디스크의 어느 부분이 여유 공간인지 알고 있는 프로그램만이 안전하게 명령을 실행할 수 있고 시스템 수준에서는 파일 시스템 드라이버 자체에서 오작동 하는 경향이 있다.

### RAID 문제
2017년 1월자로 대부분의 하드웨어 기반의 RAID 기술에서는 트림 TRIM 지원이 되지 않는다. 하지만, RAID 실행 소프트웨어에서 TRIM을 지원한다.

#### Windows
Windows 10은 RAID 볼륨을 구성할 때 "드라이브 최적화" 옵션을 사용하여 SSD RAID 볼륨에서 TRIM을 지원한다.

#### 맥 OS 운영체제
macOS RAID 드라이버는 TRIM을 지원하지 않는다. 이것은 10.7부터 macOS 10.12.x까지의 모든 Mac OS X 버전에 해당된다.

타사 SoftRAID® 애플리케이션을 사용할 때 타사 SSD 장치에 대한 TRIM 지원을 포함하여 RAID(0,1,4,5 & 10) 볼륨에 대해 TRIM이 지원된다. (참고: 비 Apple SSD 장치용 TRIM은 터미널 명령 "sudo trimforce enable"을 사용하여 구체적으로 활성화해야 함)

#### 리눅스
TRIM은 BIOS 지원 "가짜 하드웨어 RAID" 지원을 구현하고 이제 RAID 어레이에 있는 파일 시스템의 모든 TRIM 요청을 통과 하는 Linux 커널 dmraid의 2011년 1월 이후 릴리스에서 RAID 볼륨과 함께 사용할 수 있다.

dmraid와 혼동될 수 있지만 둘은 엄연히 다른 것이다. Linux의 범용 소프트웨어 RAID 시스템인 mdraid는 시스템이 파일 시스템에서 mdtrim 유틸리티를 주기적으로 실행하도록 구성된 경우 RAID 1 어레이에서 배치 기반(라이브가 아닌 파일 삭제 시) TRIM을 실험적으로 지원한다. (네이티브 TRIM 지원이 없는 ext3과 같은 것들도). Red Hat Enterprise Linux 6.5 이상에서 mdraid와 같은 후기 버전의 Linux에서는 단순한 일괄 작업이 아닌 실시간 TRIM 명령을 통해 전달하는 것을 지원한다.

그러나 레드햇은 대부분의 RAID 사용 시 SSD에서 RAID 레벨 1,4,5 그리고 6를 채택한 소프트웨어를 사용하지 않는 것을 권장한다. 왜냐하면 초기화 중에 대부분의 RAID 관리 유틸리티(예: Linux의 mdadm ) 체크섬(또는 RAID 1 및 10의 경우 드라이브 대 드라이브 확인)이 제대로 작동하는지 확인하기 위해 장치의 모든 블록에 기록하여 SSD가 예비 영역 이외의 모든 블록이 사용 시 성능이 크게 저하된다.

반면에 Red Hat은 SSD의 LVM RAID에 대해 RAID 1 또는 RAID 10의 사용을 권장한다. 이러한 레벨은 TRIM(Linux 용어로 "폐기")을 지원하고 LVM 유틸리티는 RAID 1 또는 RAID 10 볼륨을 생성할 때 모든 블록에 쓰지 않기 때문이다.

2010년 3월의 짧은 기간 동안 사용자들은 Intel Rapid Storage Technology(RST) 9.6 드라이버가 RAID 볼륨에서 TRIM을 지원한다고 믿었지만 인텔은 나중에 AHCI 모드 및 RAID 모드의 BIOS 설정에 대해 TRIM이 지원된다고 밝혔다. 하지만 드라이브가 RAID 볼륨의 일부인 경우에는 그렇지 않다.

2012년 8월 현재 Intel은 RST(Rapid Storage Technology) 11.2 드라이버가 포함된 7 시리즈 칩셋이 Microsoft Windows 7에서 RAID 0용 TRIM을 지원함을 확인했다. 인텔은 6 시리즈 칩셋에 대한 지원을 확인하지 않았지만 RAID 0 볼륨의 TRIM은 수정된 RAID 옵션 ROM 이 있는 하드웨어 지지자에 의해 Z68, P67 및 X79 칩셋에서 작동하는 것으로 나타났다. 6 시리즈 칩셋에 대한 공식 지원이 부족한 것은 기술적인 이유가 아니라 이나 소비자의 업그레이드를 유도하려는 시도나 승인 비용 때문이라고 추정된다.

X79 칩셋이 있는 마더보드에서 수정된 옵션 ROM이 필요한 예외는 제조업체가 ROM 스위치를 추가한 경우이다. 이것은 BIOS/UEFI 내부에 있는 RST 및 RST-E ROM을 모두 수반한다. 이를 통해 RST-E ROM 대신 RST ROM을 사용할 수 있으므로 TRIM이 작동할 수 있다. 인텔은 ROM과 동일한 버전의 드라이버를 사용하여 최상의 성능을 얻을 수 있다고 말한다. 예를 들어 BIOS/UEFI에 11.0.0.0m 옵션 ROM이 있는 경우 11.x 버전 드라이버를 사용해야 한다.

### 지원되지 않는 파일 시스템 활성화
파일 시스템이 자동으로 TRIM을 지원하지 않는 경우 일부 유틸리티는 수동으로 TRIM명령을 보낼 수 있다. 일반적으로 사용 가능한 블록을 결정한 다음 이 목록을 일련의 TRIM명령으로 드라이브에 전달한다. 이러한 유틸리티는 다양한 제조업체(예: Intel, G.Skill ) 또는 일반 유틸리티(예: v9.17 이후 Linux의 hdparm "wiper", 또는 위에서 언급한 mdtrim). hdparm과 mdtrim은 모두 파일 시스템에 큰 파일을 할당하고 할당된 위치를 확인하여 여유 블록을 찾는다.

모든 운영 체제에서 드라이브는 컴퓨터가 블록에 모두 0을 기록할 때를 감지하고 0 블록을 기록하는 대신 해당 블록을 할당 해제(트림)할 수 있다. 할당 해제된 블록을 읽을 때 항상 0이 반환되는 경우 이 단축키는 모두 0인 블록의 더 빠른 쓰기(및 읽기)의 경우를 제외하고 사용자에게 투명하게 공개된다. 이에 더하여 사용되지 않는 영역에 더 빠르게 쓰는 일반적인 이점도 있다. 운영 체제는 파일이나 여유 공간을 "삭제" 하기 위해 모두 0을 쓰지 않지만 일부 유틸리티는 그렇게 한다.

## 하드웨어 지원
### ATA
TRIM 명령 사양 은 INCITS( International Committee for Information Technology Standards )의 T13 기술 위원회가 주도하는 ATA( AT Attachment ) 인터페이스 표준의 일부로 표준화되었다. TRIM은 ACS-2 사양 초안의 DATA SET MANAGEMENT 명령(opcode 06h)에 따라 구현된다. ATA 표준은 병렬(IDE, PATA) 및 직렬(SATA) ATA 하드웨어에서 모두 지원된다.

원래 ATA TRIM 명령의 단점은 대기열에 넣을 수 없는 명령으로 정의되어있기 때문에 대기열에 있는 읽기 및 쓰기 작업의 일반 작업 부하와 쉽게 섞일 수 없다는 것이다. SATA 3.1은 이 문제를 해결하기 위해 대기 중인 TRIM 명령을 도입했다.

ATA IDENTIFY DEVICE 명령에서 반환된 SATA 워드 69 및 169에 의해 정의된 다양한 유형의 TRIM이 있다.

* 비결정적 TRIM: TRIM 후 논리 블록 주소 (LBA)에 대한 각 읽기 명령은 다른 데이터를 반환할 수 있다.
* 결정적 TRIM(DRAT): TRIM 이후 LBA에 대한 모든 읽기 명령은 동일한 데이터를 반환하거나 결정적이 된다.
* TRIM 후 결정적 읽기 0(RZAT): TRIM 후 LBA에 대한 모든 읽기 명령은 0을 반환해야 한다.

드라이브가 지원할 수 있는 DATA SET MANAGEMENT 명령당 최대 512바이트 블록 수를 설명하는 SATA Word 105에 추가 정보가 있다. 일반적으로 기본값은 8(또는 4kB)이지만 많은 드라이브는 TRIM에 대한 Microsoft Windows 하드웨어 요구 사항을 충족하기 위해 이 값을 1로 줄인다. 해당 명령 완료 시간은 20ms 또는 8ms ×(LBA 범위 항목 수)를 초과하지 않고 항상 600ms 미만이어야 한다.

개별 LBA 범위를 LBA 범위 항목이라고 하며 8바이트로 표시된다. LBA는 LBA 범위 항목의 처음 6바이트로 표시되고 범위 길이는 나머지 2바이트로 표시되며 0부터 시작한다(예: 0=0 및 1=1)이다. 2바이트 범위 길이가 0이면 LBA 범위 항목이 패딩으로 삭제된다. 즉, 장치가 지원하는 TRIM 범위의 각 512바이트 블록에 대해 최대값은 32MB 또는 2GB의 64개 범위이다. 장치가 8에서 SATA Word 105를 지원하는 경우 단일 TRIM(DATA SET MANAGEMENT) 명령으로 16GB를 트리밍할 수 있어야 한다.

### SCSI
SCSI는 UNMAP 플래그 세트와 함께 UNMAP 명령(TRIM의 전체 아날로그) 및 WRITE SAME 명령(10 및 16 변형)을 제공한다.

### SD/MMC
MultiMediaCard 및 SD ERASE(CMD38) 명령은 ATA TRIM 명령과 유사한 기능을 제공하지만 지워진 블록을 0 또는 1로 덮어써야 한다. eMMC 4.5는 폐기된 블록의 내용이 불확실한 것으로 간주될 수 있다는 점에서 ATA TRIM과 보다 밀접하게 일치하는 "폐기" 하위 작업을 추가로 정의한다(즉, "상관하지 않는다").

### NVM Express
NVM Express 명령 세트에는 블록 범위 세트의 스토리지 장치에 호스트의 의도를 암시하기 위한 *일반 데이터 세트 관리 명령이 있다.* 작업 중 하나인 *deallocate는* 트림을 수행한다. 또한 *할당 해제* 힌트를 제공하고 디스크가 TRIM을 수행하고 0을 반환할 수 있도록 *하는 Write Zeroes 명령이 있다.*

## 단점
* 일부 거부 가능한 암호화 체계에는 전체 디스크를 임의의 쓰레기처럼 보이게 만드는 것이 포함된다. TRIM을 사용하면 생성된 all-zero(또는 all-one) 블록이 어떤 블록이 사용되는지 쉽게 나타내므로 이 그럴듯한 거부 가능성 계층을 무효화한다. TRIM을 비활성화하는 것도 의심스러울 수 있다는 주장이 있다.
* TRIM 명령의 원래 버전은 T13 소위원회에 의해 대기열에 없는 명령으로 정의되었으며, 따라서 예를 들어 각 파일 시스템 삭제 명령 후에 전송되는 경우 부주의하게 사용하면 엄청난 실행 페널티가 발생할 수 있다. 대기열에 없는 명령의 특성으로 인해 드라이버는 먼저 모든 미해결 명령이 완료될 때까지 기다렸다가 TRIM 명령을 실행한 다음 일반 명령을 재개해야 한다. TRIM은 SSD의 펌웨어에 따라 완료하는 데 많은 시간이 걸릴 수 있으며 가비지 수집 주기를 유발할 수도 있다. 이 페널티는 시스템 사용률이 최소인 시간에 이러한 일괄 작업을 예약 하여 모든 파일 삭제 시 트리밍하는 대신 정기적으로 일괄 처리 TRIM을 수행하는 솔루션에서 최소화할 수 있다. 이 TRIM 단점은 Queued TRIM 명령의 도입으로 직렬 ATA 개정판 3.1에서 극복되었다.
* 대기 중인 TRIM에 대한 지원을 잘못 보고하거나 구현에 심각한 버그가 있는 결함이 있는 드라이브 펌웨어는 여러 장치, 특히 Micron 및 Crucial의 M500 및 Samsung의 840 및 850 시리즈에서 심각한 데이터 손상과 관련이 있다. 데이터 손상은 Linux 운영 체제(2015년 7월 1일 현재 대기열 트림 지원이 있는 유일한 OS)에서 확인되었다.

이러한 장치는 Linux 커널의 블랙리스트에 있다.대기열에 포함되지 않은 TRIM 명령을 강제로 보내는 대기 중인 TRIM 명령 대신 다음 드라이브에

* 공장에서 재인증된 SSD를 포함한 모든 펌웨어 버전을 사용하는 Micron/Crucial M500
* 펌웨어 버전 MU01을 사용하는 Micron M510
* 펌웨어 버전 MU01을 사용하는 Micron/Crucial M550
* 펌웨어 버전 MU01을 사용하는 Crucial MX100
* 모든 펌웨어 버전을 사용하는 Samsung 840 및 850 시리즈 SSD

이 파일은 또한 TRIM이 발행될 때 잘못된 블록이 데이터를 잃게 하기 때문에 일반적으로 TRIM에 대해 SuperSSpeed S238을 블랙리스트에 추가한다.

 also has a whitelist to list SSDs that are reliably known to the subsystem's maintainers to correctly implement the DRAT and RZAT flags (ATA_HORKAGE_ZERO_AFTER_TRIM), rather than ignoring them, as many drives do. The whitelisted drives are as follows:

* 크루셜(Crucial) SSD
* Intel SSD 510을 제외한 Intel SSD
* 마이크론(Micron) SSD
* 삼성(Samsung) SSD
* 씨게이트(Seagate) SSD

## 각주

## 외부 링크
* ''From write() down to flash chips'' – TRIM 명령으로 SSD가 파일 시스템에서 사용하지 않는 데이터를 지우는 방법에 대한 설명
* ''TRIM Command White Paper'' – 명령의 목적과 동작을 설명하는 백서
* Fusion-io 특허 "Apparatus, system, and method for redundant write caching"

분류:직렬 ATA
분류:SCSI
분류:솔리드 스테이트 컴퓨터 저장 장치