Linux + SSD의 스왑 파티션에서 백그라운드 삭제


11

문제

Linux의 SSD 디스크 내 스왑 파티션에서 백그라운드 TRIM 작업 을 활성화하고 싶습니다 . 여러 기사, 예를 들어 this 기사에 따르면 커널은이 구성을 감지하고 자동으로 삭제 작업을 수행하지만 테스트 에서이 동작을 강제 실행하는 데 "discard"마운트 옵션을 사용하더라도 작동하지 않는 것 같습니다.

대본

  • Linux 3.2.0을 실행하는 Debian Wheezy
  • SSD 디스크 : 1 x 120GB OCZ Vertex 3 MI
  • 다른 계층 (LVM, RAID 등)없이 2GB 스왑 "일반"파티션

배경

백그라운드 TRIM이 스왑 파티션에서 작동하는지 확인하기 위해 따라야 할 단계는 다음과 같습니다.

  1. 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
    
  2. 스왑 채우기 : 파티션을 마운트하고 모든 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()
    
  3. 스왑 내용 확인 :“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의 예상 동작은 무엇입니까? 부팅 과정에서 파티션이 활성화 된 경우 모든 사용 가능한 섹터 / 페이지를 삭제하거나 초기 전체 폐기를 발행해야합니까? 감사.


4
점은 무엇인가? RAM은 서버에 32 개의 큰 RAM이 있으면 적절히 입증되므로 저렴합니다. 스왑을 끄고 SSD를 사용하여 유용한 정보를 얻으십시오.
Tom O'Connor

3
해당 서버 에서는 스왑을 비활성화 할 수 없으며 고유 한 SSD 디스크가 있으며 기존 HDD에서 스왑 파티션을 호스팅 할 수있는 옵션이 없습니다. 스왑을 SSD 디스크에 넣는 것이 최선의 방법은 아니라는 것을 알고 있지만 스왑 파티션에서 동일한 "삭제"ext4 동작을 수행하여 디스크 성능을 최대한 향상시킬 수 있는지 궁금합니다.
santisaez

2
이 사실은 조기 최적화의 경우처럼 들립니다.
MikeyB

"의견은 5 분 동안 만 편집 될 수 있습니다"-직장에서 SF에있는 동안 바로 서비스를 제공합니다. @MikeyB 사실, 나는 이것에 대해 읽고 있습니다. Wikipedia 기사에서 내가 알지 못하는 것을 언급했습니다. "플래시 메모리 작동 특성상 데이터를 하드 디스크 드라이브처럼 덮어 쓸 수 없습니다." 스왑에서 이전에 사용 된 블록은 비어있을 것입니다. 그러나 santisaez가 스왑 내용을 확인할 때 "0000"처럼 보일까요?
Signal15

모든 것은 운영 체제 아래의 계층에서 발생합니다. OS에 관한 한, 블록의 데이터는 다시 쓰여질 때까지 존재합니다. 읽기-지우기-쓰기주기를 처리하는 것은 드라이브의 책임입니다.
MikeyB

답변:


1

ignore_swap_cluster 는 다음에서만 호출되는 것 같습니다 scan_swap_map 차례로에서 호출됩니다 get_swap_page 또는 get_swap_page_of_type . 따라서 내가 맞으면 폐기는 페이지가 해제 될 때가 아니라 새 스왑 페이지가 할당 될 때만 발생합니다.


그것은 버그처럼 들립니다.
kasperd

2
버그가 아닐 수도 있습니다. 이런 식으로 리눅스는 여러 페이지를 하나씩 폐기하는 대신 한 번에 폐기 할 수 있습니다.
lav

1

시스템에 --discard=once기본값 이있을 수 있습니다 . 특정 폐기 옵션으로 장착을 시도 했습니까?

# nano /etc/fstab
________________________________________________________________
...
/dev/sda2    none    swap    ..., --discard=pages,...    ...
...

그리고 이런 식으로 :

# swapon --discard=pages /dev/sda2

fstrim서비스 를 만들 거나 이미 사용 가능한 경우 서비스를 구성 할 수도 있습니다.


-1

스크립트를 중지하면 스왑 할당을 포함한 모든 메모리가 해제되고 "swapon -s"는 시스템에서 스왑 사용을 반환하지 않습니다. 이 시점에서 Linux는 백그라운드에서 스왑 파티션의 내용을 삭제하기 시작할 것으로 예상되지만 작동하지 않습니다 . 섹터의 내용은 몇 시간이 지난 후에도 여전히 "4141"입니다.

스왑의 내용은 swapon -s"스왑 사용 없음 "을 반환 할 때 효과적으로 '삭제 됩니다'. SSD이기 때문에 시스템은 블록의 내용을 덮어 쓰지 않으며 ( "4141"로 채워짐) 과도한 쓰기는 수명을 단축시킵니다. SSD (적어도 문서에서 빼낸 것)


5
discard마운트 옵션을 사용하는 경우 SSD 디스크에서 쓰기 증폭 문제 를 방지하려면 TRIM 명령을 기본 솔리드 스테이트 드라이브로 보내야합니다 . 적어도 이것은 ext4와 같은 다른 파일 시스템의 방식입니다.
santisaez

분명히, 그것은 실제로 그 hdparm 명령을 사용하여 0을 읽을 수 있지만 SSD의 가비지 수집기가 실행 된
후에야 가능
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.