brunch

You can make anything
by writing

C.S.Lewis

by 박지훈 Sep 29. 2017

NVMe Disk 운영

해당 블로그는 데이터센터 운영 기반, 리눅스 환경 기반으로 작성했다.

Nand 쪽 전문가가 아니며, 잘못된 지식으로 틀린 내용이 있을 수 있습니다.


목차

1-1 : Nand 제품군의 용어 정리

1-2 : Nand 제품의 특징

1-3 : PCIe Nvme (PCIe, U.2 타입)

1-4 : Garbage Collection (가비지 컬렉션)

1-5 : Over-provisioning (오버 프로비저닝)

1-6 : 4k LBA Format

1-7 : Nand 부하 테스트 시나리오

1-8 : 기타 추가 업데이트





1-1 : Nand 제품군의 용어 정리


 ✚성능지표 용어

- TBW (TeraBytes Written) : SSD에 write 될 수 있는 최대치 TB 용량.

ex) 10 TBW 면 write를 10TB까지 write 가능하다.


- PBW (Peta Byte Write) : SSD에 write 될 수 있는 최대치 PB 용량.

ex) 10 PBW 면 write를 10PB까지 write 가능하다.


- DWPD (Drive Writes per day) : 보증기간 동안 평균 하루에 얼마씩 write 가능한가?

ex) 100GB SSD가 5년 보증 10 DWPD : 하루에 1000GB씩 write 할 경우 5년까지 쓸 수 있다. 1000GB x 365일 x 5년을 하면 TBW 또는 PBW가 계산된다. 애초에 TBW & PBW 지표를 써주면 좋은 표시를 안 하거나 DWPD로 표시하는데 몇 년 기준인지 명시 안 한 경우도 있다. 왜 그럴까요? ㅎ


- MTBF (Mean Time Between Failure) : 평균 무고장 시간, 해당 지표가 높을수록 신뢰성이 좋다.

ex) 200 hours : 평균 200시간 동안은 장애가 없다.


- read & write 성능 지표 : Sequential 지표는 의미가 없다 ssd가 클린 한 상태의 성능 지표이다.

서버용으로 사용하는 거면 random 지표를 확인하고 더티 상태에서 측정한 건지 확인.

[100% span (예를 들면 100GB SSD를 테스트 전에 100GB write 테스트 진행 즉 더티 상태)]

근데 보통 MB/s로 표기 안 하고 IOPS로 표기한다. 왜 그럴까요? ㅎ

해당 지표는 대부분 더티 상태로 테스트했고 4k block 사이즈로 진행한 걸로 보면 된다.

4k로 1000 IOPS라고 하면, 4k x 1000 = 4MB/s로 환산하면 된다.

중요한 건 꼭!!! dirty (suspend 상태) 상태로 만든 후 테스트해야 의미가 있다.



하드웨어 용어

- 접점 방식 : 대표적으로 USB, Sata, SAS, Nvme 기반의 Nand제품으로 나뉘며, 장착 방식에 따라 Disk, PCI, M.2으로 나뉜다. 하이브리드 제품으로 DIsk나 M.2를 PCI젠더에 끼워 쓰는 경우도 있다.

왼쪽부터 HHHL - U.2 - SATA SSD - M.2
Ruler 타입의 SSD 고집 접도 서버용
M.2 SATA 타입과 Nvme 타입
하이브리드형

Sata : (6 SATA 인터페이스는 ATA 기반의 태생의 한계로 인해 초당 데이터 전송 속도가 최대 속도 600MB 이하의 한계치가 있다.


SAS : 이론적으로 Sata 보다 2배 빠른 인터페이스를 지원한다. 최근 고용량 (4T급 이상) NR-SAS로만 출시되고 있다.


Nvme : Sata기반의 한계의 문제점으로 인해 PCI Express 기반의 표준규격 인터페이스로, 서버에서 가장 많

이 사용되고 있다. OS의 IO 스케줄러를 거치지 않는다. Disk 타입의 Nvme의 경우 별도의 Nvme 컨트롤러 장착해 다수 (10개 이상)의 Nvme Disk를 서버에 장착할 수 있다.


M.2 : 마찬가지로 PCI Express 기반이며, PCI보단 소형화됐다. 단점으론 큰 용량 제품은 많지 않으며, PCI 지원 레인(line) 또한 많지 않아, PCI 타입의 Nvme 보다 적은 용량에 느리다. (추후 기술의 발전으로 넘을 수 있을 거 같다.)

[PCI 기반은 몇 세대 인지? PCI레인은 몇 개인지? 에 따라 속도가 틀리다. 자세한 건 1-3 참조]

https://ko.wikipedia.org/wiki/NVM_%EC%9D%B5%EC%8A%A4%ED%94%84%EB%A0%88%EC%8A%A4











1-2 : Nand 제품의 특징

NAND란 무엇인가?

NOT AND의 줄임말로 두 개 모두 참인 경우 참. (비슷한 걸로 NOR이 있으면 둘 중 하나만 참이면 참.)

NOT AND 논리 회로를 반도체 칩으로 구현해서 만든 것을 NAND 제품이다.


NAND 논리 회로를 반도체 칩으로 구현해서 만들어지므로, NAND 회로를 조금이라도 알아야겠다.

- 논리 회로에는 두 개의 입력단이 모두 참일 때만, 출력단이 참이 되는 AND 회로

- 두 개의 입력단 중 하나만 참이면, 출력단이 참이 되는 OR 회로

- 참은 거짓으로, 거짓은 참으로 바꿔 주는 NOT 회로

- AND 회로와 NOT 회로를 합쳐서, 입력단 두 개가 모두 참 일 때만 출력단이 거짓이 되는 NAND 회로

- OR 회로와 NOT 회로를 합쳐서, 입력단 두 개가 모두 거짓일 때만 출력단이 참이 되는 NOR 회로 등이 있다.

- SSD에서 자료 저장용으로 쓰이고 있는 (플래시 메모리)는 이런 논리 회로들 중에서 (NAND 회로)를 무수히 연결해서 만든 반도체 칩 덩어리이므로, SSD를 이해하려면, NAND 회로가 뭔지 정도는 알아야 한다.



[1] Cell



(1) Nand의 3가지 역할

http://cappleblog.co.kr/582

[채플님의 글에서 발췌했습니다. 자세한 건 위 블로그에 참 잘 정리되어 있습니다.]


플래시 메모리 구조 및 구성에 대한 디테일한 내용은 아래 동영상을 참조해주세요.

https://youtu.be/_ZlvzLiFErw

https://youtu.be/s7JLXs5es7I


1. 쓰기 (write)

2. 지우기 (Delete)

3. 읽기 (read)

 플로팅 게이트에 채워진 전자의 양을 파악하여 계산한다. SLC 같으면 가득 채워져 있으면 1, 비워져 있으면 0. MLC ~ QLC부턴 Bits/cell 이 늘어나기에 경우의 수가 많아집니다. 그래서 흔히 한 셀에 많은 bit를 써야 하는 write 과정에선 SLC ~ QLC 순으로 퍼포먼스 차이가 나게 되고, 그만큼 한셀에 빈번한 전류값을 넣어야 하므로 산화막 한계치가 금방 오고 수명이 낮습니다. (이는 각 벤더사의 펌웨어단의 훌륭한~ 로직으로 극복해야 합니다.)


DIE 사이즈가 동일할 때 1셀에 1비트 증가될 때마다 디스크 용량도 2배가 된다.
2018년부터는 고용량의 QLC 기반의 제품이 주력이 될 것으로 예상된다. 이제 스핀들 디스크의 시대도 곧 막이 내릴 것이다.


참고로 3D Nand 기술에 대한 설명 동영상입니다. (CC의 자막을 한글로 하면 보기 편해요.)

https://www.intel.co.kr/content/www/kr/ko/solid-state-drives/3d-nand-technology-animation.html





1-3 : PCIe Nvme  (PCIe, U.2 타입)

Nvme는 PCIe 기반의 제품이다. SATA&SAS타입의 SSD와 비교해 장점으로는 아래와 같다.

HDD, SSD의 경우 물리적으로 (CPU - Memory - PCIBUS - 노스브리지 - HBA - AHCI)으로 흘러가며, PCIe의 경우 AHCI, HBA의 구간이 생략된다
커널 레벨. Nvme의 경우 버틀 렉이 될만한 레이어를 생략한다.



- intel 공식 페이지에 자신의 서버의 CPU당 지원 가능한 PCIe 정보를 확인한다.

 + 보통 서버의 경우 PCI Nvme 장치 외에, 외장형 카드 (Raid Card, M.2, NIC 등) 별도의 Lane을 차지할 수 있으니 서버 구성시 lane의 여유를 확인한다. (sata 및 usb 등 일부 포트는 CPU가 아닌 PCH lane을 사용)

예를 들어 8 line을 지원하는 Nvme 디스크를 48 line에 지원하는 CPU에 몇 개 까지 꽃을 수 있나?

E3-1240V6 CPU : 16 lane 사용
데스크톱 i7-6950x CPU : 40 lane 사용
E5-2680V4 CPU : 40 lane 사용 x 2 cpu = 총 80 lane까지 가능


40 lane CPU의 full lane 사용 예제






장착한 파트(PCIe Nvme)가 많은 lane을 지원할수록 대역폭이 보장된다. CPU에 따라 틀리지만 보통 MAX 40 lane까지 보장한다.




< Nvme U.2 >

- Nvme HHHL타입 (PCI 카드 타입) 외에 U.2 타입 (2.5인치 Disk 타입)도 존재한다.

U.2 타입 장단점은 아래와 같다.


+ 장 점 

  1. 디스크 벤더사에서 PCIe 타입 모델에 비해 폭넓은 모델과 용량 레퍼런스를 제공한다.

  2. 서버에 장착-탈착이 손쉬우며, 핫스왑을 지원한다. (Raid  구성시 U.2 타입이 운영이 편하다.)


 + 단 점

   1. 아직 Nvme 기술은 안정성이 뛰어나다고 할 수 없다. 시스템 <-> Nvme 드라이버 및 펌웨어 간의 버그 등이 아직까지 종종 발생한다. U.2의 경우 물리적인 구성이  (backplane <-> 케이블 <-> Nvme PCI Lane변환 커넥터(컨트롤러) <-> 보드) 과정을 거쳐야 한다. 부품이 늘어나는 만큼 가격 상승과 PCIe 타입의 경우 PCI 슬롯에 디렉트로 꼽는 거라, 그만큼 장애 포인트도 줄어든다.

  2. 같은 모델이라도 U.2 보다 PCIe 타입의 Nvme가 더 넓은 대역폭의 PCI Lane을 지원한다. 이는 성능과 연계되는 부분이다.


환경에 맞게 U.2 또는 PCIe (HHHL) 타입을 선택해서 운영 하자.

Intel 제온 브로드웰 Nvme U.2 연결 구조 (PCIe Lane Nvme 변환 커넥터 PCI 카드방식)


백플렌 <-> (빨간 동그라미의 4 포트)로 U.2 타입이 연결된다. NVMe PCI Lane 변환 커넥터가 별도의 PCI 카드 형태가 아닌 보드에 내장된 형태.













1-4 : Garbage Collection (가비지 컬렉션)


Garbage Collection : GC라 기술하겠다. 

GC의 목적은 지우기(erase) 작업을 최소화하고, free block를 확보하기 위함이다.

NAND 구조에서 지우기 작업이 가장 많은 비용이 들며 (읽기/쓰기는 페이지 단위로 이루어지고 삭제 작업은 Block 단위로 이루어진다. 이는 곧 삭제 동작 전에 삭제되지 않아야 할 데이터는 다른 block로 옮긴 후에 block 삭제가 이루어진다.)

위 그림과 같이 가장 왼쪽에 있는 그림은 free block 상태이며, 제일 오른쪽이 뭐 더러운 block 상태라 하자.

GC가 발동되면 아래 그림과 같이, write 된 셀과 invalid (erase 됐지만 실제 안 지우고 이거 GC 하면 지울 거야 라고 마킹만 한 상태, 왜 바로 안 지워요??? 플래시 메모리 특성상 erase job이 매우 느리며 read, write에도 영향을 준다.) 셀들을 정리해서, 마치 예전 디스크 조각모음처럼? 이쁘게 정리해준다.

free block이 많을수록 더 좋은 성능을 낼 수 있으며, free block 부족한 경우 결국 더티 상태로 빠지며 최악의 성능이 나온다.

GC는 그럼 언제 실행되는가? 이는 제조사별로 틀리다.

Nand가 전체 용량 대비 몇% 이상이 될 때, 또는 idle상태를 인지 한 후 forground GC 또는 background

 GC 등의 방식으로 동작할 것이다. (예전에는 사용자가 수동으로 GC를 새벽에 crontab에 박거나 fstab에 옵션으로 넣어 운영하는 경우도 있었지만, 이젠 제조사의 GC기술이 많이 좋아졌습니다.)





아래 동영상 참조.

https://www.youtube.com/watch?v=qUZtXUP78sw







1-5 : Over-provisioning (오버 프로비저닝)


Over-provisioning : OP라 기술하겠다. 

free block의 확보를 위해 디스크 공간의 일부를 별도의 free block을 위한 공간으로 배치하는 기술이다.

OP영역은 고정된 구간이 아닌 유동적으로 움직인다. OP영역 User영역이 되고 반대로 User 영역이 OP영역으로 할당된다.

아래 그림처럼 OP영역을 블록마다 변환한다. 벤더사마다 정책은 틀리겠지만 user영역이 부족할 때 실 데이터를 OP영역 쓰고, User영역에 스왑 되는 거 같다. (이거 정확히 아시는 분은 댓글 좀...)

Default OP : SSD마다 정해진 영역이며, 해당 영역이 어떤 역할을 하는지는 확인하지 못했다.

아무래도 CRC체킹이나 SMART 정보 등을 위한 영역이 아닐까... 생각된다.

기가바이트, 기가비트로 1G를 기준으로 바이트로 환산하면 아래 그림과 같다. 

예를 들어 128GB SSD 라 하면 이를 128 Gib로 환산 (1GB = 1073MB)하면 Gib가 기가당 78MB 정도 더 크다. 128GB x 73MB = 9,984MB 정도 늘어난다. 즉 128GB = 129 Gib 정도이다.

GB , GiB 1기가 기준 환산

Factory OP : 제조사에서 공장 출하 시 픽스되어 정한 OP 크기이다.

SSD & Nvme는 Nand 자체 생산이 가능한 삼성, 인텔의 Nand 기반으로 생산한다. (일부 제조사는 Nand는 삼성, 인텔 꺼를 쓰지만 컨트롤러는 직접 제작하는 곳도 있다.)

Nand 자체가 같기 때문에, 용량도 똑같다. 

어떤 제품은 240GB SSD 모델이 있고, 어떤 제품은 200GB SSD 모델도 있다.

이는 Factory OP 영역을 크게 잡아서 200GB가 된 거고, 적게 잡거나 (아예 잡질 않거나...) 240GB가 된 것이다. 같은 Nand에 OP을 적게 줘서 퍼포먼스에 문제가 될 수 있으니, User 가 직접 Dynamic OP 영역을 직접 할당하거나 벤더사에서 전용 툴을 제공하기도 한다.

 

SSD & Nvme를 선택할 때, 해당 모델의 Inherent(Default) OP와 Factory OP가 각각 어떻게 할당되어 있는지 확인해 보는 것이 중요하다. 

다이내믹 OP = 사용자가 강제로 OP를 추가 할당한 영역


이 표로 대략 벤더사에서 기본적으로 OP을 어느 정도 줬는지 유추할 수 있지만, 계산방식에 따라 틀릴 수도 있다.

OP가 영역이 크면??

퍼즐처럼 SSD에서 여유 블록이 많으면 그만큼 빨리 처리할 수 있다.

서론 : SSD퍼포먼스는 얼마나 지우기(erase) 작업을 적고 효율적으로 하느냐 이다. (GC를 최대한 적게...)

OP영역이 크게 잡으면 그만큼 Free block (아무것도 쓰여있지 않는 깨끗한 상태 page만 있는 block) 많다.

이는 GC 시점을 늦출 수 있게 된다.

그래서...??? 뭐가 좋은데???

GC가 늦어지면 더러운 block 이 그만큼 많아진다.

예를 들어, GC발동 시...

1) 10개의 더티 블록 - 1분마다 GC발동

2) 100개의 더티 블록 - 10분마다 GC발동

GC 방식은 제조사에서 공개하지 않는, 핵심 기술 중 하나 이기에, 고객사 환경에 맞는 테스트와 실 투입 후 적합한 제품을 선정하는 게 중요하다.

 

마지막으로 OP를 많이 주면??? 용량은 줄어들지만 빨라지겠네??

반은 맞고 반은 틀리다.

예를 들어, io 부하 툴로 지속적으로 write 부하를 줬을 경우 특정 구간(더티 상태가 되는 구간)이 되면 속도가 OP를 줬건 안 줬건 동일한 속도까지 떨어진다.

즉 이는, 제조사에서 제공하는 컨트롤러+펌웨어 가 지능적으로 운영 중인 서버의 GC 및 기타 기술을 사용해, 최악의 더티 상태가 안되게끔 하는 게 핵심이며, OP는 단지 거기에 맞춰 어느 정도를 주면 내가 쓰는 환경 (io 플로우 등을 확인)에 맞게 설정을 해야 한다.



위 와 같이 OP 늘리면 좋아요~라는 자료가 많다.

실제로 OP를 늘리면 더티 상태에서 위와 같이 퍼포먼스 보장(28% 늘린 그래프)을 해주는 제조사도 있고,

단지 더티 상태로 진입되는 시간만 늘어나고, 결국엔 OP 설정을 통한 퍼포먼스 보장이 안 되는 경우도 있다.

결국 제조사의 Nand 품질 및 컨트롤러와 펌웨어가 좋아야 OP도 빛을 볼 수 있다.



OP 설정 별 성능 향상에 관련된 자료 참조 : (같은 Nand와 플랫폼을 써도 OP를 기본 7% 준걸 미들 레인지급 모델, 28% 준걸 하이엔드급 모델로 분류하여 나누는 경우도 있다.)

http://www.samsung.com/semiconductor/minisite/ssd/downloads/document/Samsung_SSD_845DC_04_Over-provisioning.pdf


아래 동영상 참조.

https://youtu.be/Q15wN8JC2L4



Wear leveling : Nand Cell 수명 관리 기술, Nand는 전기를 가할수록 산화막이 수명이 줄어든다. 

Nand 컨트롤러 레벨에서 수명이 많이 남은 Cell을 우선적으로 Write 하고, 수명이 적은 Cell을 최대한 Write

하지 않게 관리하는 기술이다.


Write amplification (쓰기 증폭) : Nand 페이지의 다시 쓰기 작업과 가비지 컬렉션을 위한 페이지 다시 쓰기 작업 등으로 인해 생기는 현상.

GC 가 일어날 때, 읽기-수정-쓰기(read-modify-write) 가 일어난다.

2048KB의 블록 크기를 사용하고 8KB의 페이지 크기의 SSD의 경우의 예제로,

실제로 240KB 크기의 파일을 지우려고 할 때, 

(읽기) SSD 컨트롤러는 주 메모리에 해당 파일이 있는 블록을 읽어 들이고,

(수정) 240KB (30개의 페이지(한 페이지에 8KB)) 삭제하고

(쓰기) 새로운 블록에 수정된 내용을 쓴다.

이는 24KB의 다시 쓰기를 위해 2048KB의 쓰기가 동작 함을 위미 하며, 쓰기 증폭 지수는 8.5x 가 됩니다.


위는 단순한 예제이며, 실제 제조사는 좀 더 효율적인 알고리즘을 적용합니다. 예를 들어 한 개가 아닌

여러 개의 잡을 모아~ 페이지 사이즈에 맞춰서(Aligned) 블록을 완전히 채워서 쓰기를 한다.

GC 안에 포함된 기술로 보면 되며, 제조사마다 어떻게 알고리즘 되어있고 구현하는지는 틀리다.






1-6 : 4k LBA Format


4k LBA format을 지원하는 모델이라면, 가능하면 4k로 써라. Nand Cell이 4k 단위  (일부 4k LBA 포맷에

서 돌아가지 않는 레거시 응용프로그램이 있다면, 크래쉬가 날 것이다.)


- 포맷 방법 (리눅스 기반)

공통 : nvme format -l 3 /dev/nvme0  <== nvme-cli 툴.

인텔 : isdct start –intelssd 0 -NVMeFormat LBAformat=0 [0:512B, 3:4k] <== intel 툴

삼성 : magican 이 있긴 하나, 지원되는 모델이 한정(2017년 이후 모델부터 지원) 되어 있으니 확인 필요.


- 4k LBAformat를 지원 안 하는 모델도 있다. 확인하는 방법은 아래와 같다.

 + smartctl -a /dev/nvme0 <== smartctl 최신 버전 및 nvme-cli 가 설치되어 있어야 한다.

(결과 값 중) 아래와 같이 LBA Sizes 항목을 보자, ID로 표시된 게 위 포맷 옵션 중 -l 3 또는 LBAformat=0 여기 인자 값이 아래 ID 값이다.

+ 4k 포맷이 지원되지 않는 모델은 아래와 같이 출력된다.


smartctl 외에 nvme-cli로 확인하는 방법은 아래와 같다. 4k 포맷을 아래와 같이 옵션을 넣어서 할 수 있다.

ex) nvme format /dev/nvme0n1 -n 1 -t 1800 -l 3

nvme-cli format 옵션 설명
lbaf 3에 in use 선택되어 있다. 포맷 옵션 l 이 이거다

4k로 하드웨어 LBA를 맞췄다면, 여기에 맞게 어드벤스 포맷 즉 4k 정렬로 해서 포맷을 한다. 정렬이 되지 않으면 눈이 띄게 성능이 낮아진다.

리눅스 기준으로 아래와 하면 된다.

ex) 디스크 추가 시

1. parted /dev/nvme0n1

2. mklable gpt

3. mkpart primary 1 100%

4. unit s

5. align-check optimal 1

5. 결과값이 1 aligned 이면 정렬됐다는 것.

http://rainbow.chard.org/2013/01/30/how-to-align-partitions-for-best-performance-using-parted/



disk 물리 섹터는 크게 아래와 같이 3종류로 나뉩니다.

섹터 align을 맞추기 위해선 최소 1 MiB (1048576Byte)로 시작해야 됩니다.

https://superuser.com/questions/393914/what-is-partition-alignment-and-why-whould-i-need-it


논리섹터가 512B의 경우 x 4096s = 1MiB

논리섹터가 4k의 경우 x 256s = 1MiB


512 디스크에선 2048s, 4kn 디스크에선 256s 개가 되어야 합니다.


parted 로 mkpart 할때 정렬이 틀어지면 친절하게 에러가 나오니 설정에 크게 걱정할 필요는 없어보인다.


512e 디스크


4kn 디스크










1-7 : Nand 부하 테스트 시나리오

IO 부하 툴은 아주 많이 있다. 리눅스를 예제로 iozone, vdbench, stress와 같은 오픈소스 외 유료 라이선스 툴까지 다양하다.


제가 주로 측정하는 방식은 아래와 같습니다.

운영 환경 및 Nand 모델 종류에 따라 테스트 방법 및 시나리오도 전부 틀립니다. 그중 일부 예제입니다.

===========================================================================

(1) FIO를 이용하여 dirty 상태로 만든다. (Nand 제품은 clean 상태에서의 측정은 의미가 없다.)

 + 전체 용량 x 2 크기의 시퀀설 write

 + 전체 용량 x 3 크기의 랜덤 write


(2) FIO를 이용해 1~3시간 동안 512b ~ 32k까지 구간별 랜덤 write 부하를 준다.


(3) iostat (다른 모티터링툴도 가능)을 이용해 데이터를 추출합니다.

 + 초당 job 요청수 (r/s, w/s)와 block 사이즈를 대조하여, 초당 처리량 (rMB/s, wMB/s)등 지표를 살펴보고, io가 순간 밀리거나 멈추는 현상이 있는지는 await 항목을 참고하며 관찰한다.

Nand 제품의 경우 Read 퍼포먼스 말도 안 되고 좋고 큰 이슈가 없다. 하지만 Write의 경우 지표가 편차가 클 수 있고 순간 (수초) 멈추는 이슈가 발생할 수도 있다. (SATA 타입의 SSD에 비해 아직까지도 Nvme는 이슈가 많다. 커널에 따라서도 너무 틀리다.)


해당 테스트는 퍼포먼스도 볼 수 있지만, io가 밀리거나 멈추는 현상이 있는지를 주목해야 합니다.

iostat -dxm 1


(4) ACT를 이용한 레이턴시 측정

 + 해당 툴은 강제로 Nand 제품을 더티 상태로 만든 후 부하를 주어 레이턴시 값을 수치화하여 제공한다.

==============================================================================




대부분의 BMT 관련 사이트에선 nvmeorg에서 공식 인정? 하는 FIO 툴이 Nand 기반 측정을 하며, 개인적으로도 Nand 기반은 FIO로 측정하는 게 좋은 거 같다.


(1) FIO

<설치>

- yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel libaio-devel fio 

또는 최신 버전을 원할 경우 소스 파일을 직접 다운 후 설치해도 된다.


<사용법>

FIO man page : https://linux.die.net/man/1/fio


- 파일로 config 파일을 작성해 실행 (./fio config파일명)

fio 컨피그 예제

- 수동 옵션

<4k 블록 사이즈 + write만 측정 + /data/test1 이란 파일을 만들어 측정>

fio--name=seqtest --rw=write --bs=4k --ioengine=sync --iodepth=32 --direct=1--

norandommap --randrepeat=0 --refill_buffers --overwrite=1--filename=/data/test1 --

size=1450G


<4k 블록 사이즈 + random write만 측정 + umount 된 상태의 nvme0 n1 디바이스 측정>

fio --name=randtest--readwrite=randwrite --bs=4k --invalidate=1 --end_fsync=0 --direct=1--ioengine=libaio --iodepth=32 --norandommap --randrepeat=0--filename=/dev/nvme0n1 --size=850G



(2) ACT

ACT git : https://github.com/aerospike/act/

ACT 소개 자료 : https://github.com/aerospike/actGettingThe Most Out Of Your Flash/SSDs


<설치>

ㄱ. wget https://github.com/aerospike/act/archive/master.zip -O act-master.zip

ㄴ. 압축 풀고 해당 폴더로 진입
ㄷ. make && make -f Makesalt
ㄹ. /actprep /dev/테스트할 디바이스 &  

  ++ 약 30 분 동안 기다립니다. 이 명령은 SSD 디스크를 포맷하는 데 사용하고, 임의의 데이터를 생성한다

ㅁ. python act_config_helper.py  ##conf 파일 작성


<실행>

actactconfig.txt > ouput.txt &


<결과 확인>

latency_calc/act_latency.py -l output.txt -t 1









1-8 : 기타 추가 업데이트


  (1) 내부 구조 및 DRAM 흐름도


SATA 타입 Nand 내부 구조


- 일부 저가형 (가정용) SSD의 경우 DRAM+배터리가 없습니다. 기업용 또는 엔터프라이즈급 모델에만 있으며,

이런 경우 맵핑 테이블을 실제 Nand로 저장하며 (일부 제품은 적은 용량의 sram 캐슁), write 및 레이턴시가 느립니다.



브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari