문제
Linux의 SSD 디스크 내 스왑 파티션에서 백그라운드 TRIM 작업 을 활성화하고 싶습니다 . 여러 기사, 예를 들어 this 기사에 따르면 커널은이 구성을 감지하고 자동으로 삭제 작업을 수행하지만 테스트 에서이 동작을 강제 실행하는 데 "discard"마운트 옵션을 사용하더라도 작동하지 않는 것 같습니다.
대본
- Linux 3.2.0을 실행하는 Debian Wheezy
- SSD 디스크 : 1 x 120GB OCZ Vertex 3 MI
- 다른 계층 (LVM, RAID 등)없이 2GB 스왑 "일반"파티션
배경
백그라운드 TRIM이 스왑 파티션에서 작동하는지 확인하기 위해 따라야 할 단계는 다음과 같습니다.
TRIM 지원 : SSD 디스크가 TRIM 명령을 지원하고 커널이 장치를 비 회전으로 플래그를 지정하는지 확인하십시오.
# hdparm -I /dev/sda | grep TRIM * Data Set Management TRIM supported (limit 1 block) * Deterministic read data after TRIM # cat /sys/block/sda/queue/rotational 0
스왑 채우기 : 파티션을 마운트하고 모든 VM 캐시를 정리하고 vm.swappiness를 적극적으로 100으로 설정하여 스왑하도록 Linux를 구성하십시오. 그런 다음 사용 가능한 모든 메모리를 할당하고 커널이 스왑을 시작하도록 스크립트를 실행하십시오.
# swapon [--discard] /dev/sda2 # echo 3 > /proc/sys/vm/drop_caches # echo 100 > /proc/sys/vm/swappiness # ./fill-up-memory.up
이 스크립트는 32GB의 물리적 메모리 + 2GB 스왑 파티션이있는 서버에서 실행되며 메모리에 ~ 33.8GB의 객체를 생성하므로 모든 메모리를 채우고 스와핑을 시작하기에 충분합니다. 다음은이 동작을 수행하는 스크립트의 예입니다.
#!/usr/bin/python mem = 33.8 testing = 'A' * int(1024 * 1024 * 1024 * mem) raw_input()
스왑 내용 확인 :“swapon -s”는 100 % 스왑 메모리가 사용되었음을 나타냅니다. “hdparm --read-sector”를 사용하여 스왑 파티션 섹터의 원시 내용을 확인하고 모든 바이트가“A”문자에 해당하는 16 진수 표기법 인“4141”로 설정되어 모든 것이 예상대로 작동합니다. 다음은 스왑 파티션의 내용을 섹터별로 읽는 스크립트 예입니다.
#!/bin/bash for sector in `seq 194560 4100095` ; do hdparm --read-sector $sector /dev/sda done
참고 : parted, cfdisk 등을 사용하여 스왑 파티션의 시작 / 종료 섹터를 얻을 수 있습니다.
스크립트를 중지하면 스왑 할당을 포함한 모든 메모리가 해제되고 "swapon -s"는 시스템에서 스왑 사용을 반환하지 않습니다. 이 시점에서 Linux는 백그라운드에서 스왑 파티션의 내용을 삭제하기 시작할 것으로 예상되지만 작동하지 않습니다 . 섹터의 내용은 몇 시간이 지난 후에도 여전히 "4141"입니다.
필자는 몇 가지 테스트를 수행했으며 swapon()
시스템 호출을 사용하여 파티션을 활성화 한 경우에만 Linux가 전체 폐기를 수행 하지만 백그라운드에서 절대 "discard"마운트 옵션이 활성화되어 있지만 / etc / fstab에서 활성화되지 않은 것으로 보입니다 .
추가 연구 : blkdev_issue_discard ()는 기본 SSD 장치에 TRIM 명령을 전송하는 커널 함수이며이 함수에 대한 두 가지 고유 한 참조가 있습니다 mm/swapfile.c
.
discard_swap()
swapon () 프로세스 중에 호출되며, "discard"마운트 옵션이 활성화되면 모든 내용을 버리고 예상대로 작동합니다.discard_swap_cluster()
클러스터 스왑의 내용을 삭제해야하지만 TRIM 명령을 수행하지 않는 것 같습니다.
질문 : 스왑 + SSD 장치에서 Linux의 예상 동작은 무엇입니까? 부팅 과정에서 파티션이 활성화 된 경우 모든 사용 가능한 섹터 / 페이지를 삭제하거나 초기 전체 폐기를 발행해야합니까? 감사.