
개발 배경 리눅스 컨테이너는 런타임 환경에서 애플리케이션을 패키지화하고 분리하는 기술입니다. 실행에 필요한 모든 파일이 호스트 시스템과 분리되어 동작하기 때문에 컨테이너 환경에서 동작하는 프로레스는 이식과 관리가 쉽습니다. 하지만 컨테이너의 리소스가 호스트와 분리되었다고 해도 실제 스토리지에 저장되는 데이터들은 격리되지 않습니다. 즉, 하나의 스토리지를 여러 컨테이너가 공유해서 사용하고 여러 컨테이너가 동시에 한 스토리지에 접근하는 경우 I/O 간섭이 발생합니다. 만약 이러한 데이터들 사이에 격리(컨테이너 수준의 격리)가 이루어진다면 각 컨테이너들이 저장 장치에 접근할 때 I/O 간섭이 발생하지 않기에 빠르고 효율적인 처리가 가능해질 것입니다. 기존 문제점 현재 사용되는 Block Interface SS..

dm-zoned-target.c가 I/O 과정의 흐름을 담당하는 함수들이 모여있었다면, dm-zoned-metadata.c는 I/O를 실행하기 위해 필요한 메타데이터들에 관한 함수들이 모여있는 코드입니다. Write 하기 위한 zone이 chunk와 매핑되어있는지, bio가 접근하는 chunk id는 몇 번인지, device 상태는 어떤지 등과 같은 원시적인 데이터와 관련된 로직들이 모여있습니다. 이 파일은 3000 라인이 넘는 많은 양의 코드이지만, 핵심적인 함수들을 우선 파악한다면 I/O 루틴을 보다 수월하게 이해할 수 있습니다. 함수를 소개하기에 앞서, metadata.c 에서 가장 많이 사용되는 zone 구조체와 dmap 구조체를 먼저 이해하고 넘어가겠습니다 ! dm_zone struct dm_z..

dm-zoned는 메타 데이터를 관리하는 dm-zoned-metadata.c, target device를 다루는 dm-zoned-target.c, regular block의 reclaim을 관리하는 dm-zoned-reclaim.c 총 3개의 C 파일과 dm-zoned.h 헤더 파일과 함께 구성되어 있습니다. I/O write Routine dm-zoned의 I/O write 루틴에서 다루는 함수가 정말 많기 때문에 관련된 모든 함수를 정확히 파악하기가 어렵습니다. 또한 참고할만한 레퍼런스가 없기 때문에 직접 코드를 하나씩 까보며 이해하는 과정이 필수입니다. 저 또한 해당 루틴을 파악하기 위해 커널에서 fio를 실행하여 trace 해보고, 코드를 분석하는 과정이 한 달 이상 소요되었습니다. 그러므로 함수..

ZNS SSD는 현재 많이 사용되는 Block Interface SSD와는 달리 zone 단위로 읽고 쓰기 때문에 디바이스에 데이터를 접근시키기 위한 파일시스템 인터페이스가 필요합니다. Zone Storage documentation을 보면 여러가지 파일시스템을 이용한 연결 방법을 제시하고 있는데, 저는 dm-zoned를 이용해 연결하는 방법을 시도했습니다. dm-zoned-tools project hosted on GitHub로 이동하여 dm-zoned를 설치합니다. README 파일을 천천히 따라가다 보면 쉽게 설치할 수 있습니다. 설치 중간에 라이브러리가 없다고 나오는 경우가 있는데, 해당 라이브러리를 설치한 후 다시 시도하면 정상적으로 진행됩니다. 1. ZNS SSD 초기화 sudo zbd res..

Device Mapper(디바이스 매퍼)는 virtural block device를 physical block device로 매핑하는 리눅스 커널에서 제공하는 프레임워크입니다. Device Mapper는 device mapper가 지원하는 virtural block device에서 다른 블록 장치(physical block device)로 데이터를 전달하며 작동합니다. 즉 실제 물리 블럭 디바이스에 데이터를 접근시키기 위한 인터페이스라고 할 수 있습니다. ZNS SSD에 직접적으로 I/O를 실행하기 위해서는 zonefs 파일 시스템을 사용해야합니다. 그러나 현재 리눅스 컨테이너는 zonefs를 지원하지 않고 zonefs는 POSIX filesystem과 호환되지 않기 때문에 ZNS SSD에 직접적으로 I..

이번 포스팅에는 커널 내부 로직을 디버깅하는 방법에 대해 알아보겠습니다! 하나의 잘 만들어진 라이브러리나 툴을 정확히 이해하기 위해서는 내부 로직을 파악하는 것이 굉장히 중요합니다. 어떤 함수가 어떤 함수를 호출하는지, 어떤 인자를 받아와 처리하는지, 어떤 값을 반환해주는지와 같은 정보를 파악하며 이해한다면 좀 더 수월하게 이해할 수 있습니다. 또한, 이미 존재하고 있는 라이브러리나 툴을 필요에 따라 개선시키기 위해서는 내부 로직을 파악하는 것이 필수적입니다. 이번에 리눅스 device mapper를 개선하기 위해 사용했던 방법을 소개하겠습니다. - printk 먼저 printk입니다. printk는 c언어에서 익숙한 printf와 사용법이 동일합니다. 말 그대로 printk -> kernel에서 사용하..

리눅스 서버를 이용해서 모듈을 수정하거나 라이브러리를 원하는 대로 수정해야하는 경우 커널 코드를 수정해야합니다. 커널 코드를 한번 다운받고 원하는 버젼의 커널을 설치한 이후에는, 수정한 코드 컴파일만 다시 해주면 쉽게 적용할 수 있기 때문에 익혀놓으면 커널을 다루기 굉장히 편리합니다 ! 커널 다운로드 원하는 커널 버젼을 선택하여 다운받을 수 있습니다. 저는 5.10 버젼의 커널 코드가 필요하여 5.10으로 다운받아서 사용했습니다. 만약 5.6버젼이 필요한 경우에는 git clone -b v5.6 .... 명령어를 이용하면 됩니다. 정상적으로 커널 소스가 다운로드 되면 현재 디렉토리에 linux 디렉토리가 생성됩니다. git clone -b v5.10 --single-branch --depth 1 http..

설치환경 서버:Ubuntu 20.04 LTS 커널: 5.13 1. ctags + cscope 설치 apt-get install ctags -y apt-get install cscope -y 2. vim + plugin 설치 git clone을 하기 위해 git도 함께 설치합니다. 미리 설치되있으면 생략해도 됩니다. sudo apt-get install vim -y sudo apt-get install git -y 3. 디렉토리 생성 및 git clone mkdir ~/.vim mkdir ~/.vim/bundle git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim 4. .vimrc 파일 생성 vim 환경설정을 하는 ...

모든 명령은 루트계정으로 전환해서 입력하면 더 편리하게 진행할 수 있습니다. ubuntu 버젼은 20.04입니다. lxc와 관련된 패키지를 설치합니다. sudo apt-get install lxc lxctl lxc-templates -y 설치 후에 리눅스 컨테이너 상태를 확인할 수 있습니다. lxc-checkconfig 다음은 리눅스 컨테이너를 생성하는 명령어입니다. lxc-create -n myContainer -t ubuntu lxc-create로 리눅스 컨테이너를 생성할 수 있습니다. lxc-create는 설정정보와 사용자 정보가 저장되는 시스템 객체를 생성합니다. name은 다른 lxc 명령어들에서 특정 컨테이너를 지정하는데 사용됩니다. 객체는 /var/lib/lxc에 작성되는 디렉토리이며, ..

ZNS ZNS란 Zoned Namespace의 약자로, 네임스페이스(Namespace)를 존(Zone) 단위로 나눠 사용하는 기술을 말합니다. 여기서 네임스페이스는 논리 블록으로 쉽게 컴퓨터 탐색기에 보이는 C:\, D:\가 각각 하나의 네임스페이스라고 이해하면 쉽습니다. ZNS는 SSD 공간을 여러 개의 zone으로 나누어 사용할 뿐만 아니라 운영체제에서 zone을 직접 관리할 수 있는 인터페이스를 제공합니다. 과거 데이터센터에는 하나의 성능 좋은 컴퓨터(Server)에서 하나의 운영체제와 응용프로그램을 구동했습니다. 요즘에는 하드웨어 위에 다수의 가상 운영체제와 응용프로그램이 구동되는 형태입니다. 즉, 다양한 프로그램이 하나의 저장장치를 동시에 읽고 쓰는 것입니다. 따라서 데이터센터에서는 속도뿐만 아..
- Total
- Today
- Yesterday
- 환경 별 로깅 전략 분리
- 5주차 회고
- ZNS SSD
- 우테코 회고
- 스프링MVC
- 프로젝트
- 3차 데모데이
- 런칭 페스티벌
- dm-zoned
- jpa
- 피움 6주차 회고
- 스프링 프레임워크
- 알림기능개선기
- 회고
- 스프링 Logback
- 스프링 부트
- 팀프로젝트
- 2차 데모데이
- 알림개선기
- 백준
- java
- Spring
- 우테코
- 네트워크
- CI/CD
- ZNS
- 피움
- 파이썬
- dm-zoned 코드분석
- 8주차 회고
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |