[Book] DevOps와 SE를 위한 리눅스 커널 이야기

1. Overview ★★★★ - 리눅스 서버의 성능에 영향을 끼칠 수 있는 부분들을 공부해볼 수 있는 책. 하지만 인프라가 클라우드를 바탕으로 고도로 추상화되고 있는 요즘의 상황을 고려했을 때 로우 레벨 수준의 내용이나 코드를 자세히 다루는 부분들은 일반적인 DevOps나 SE에게는 다소 불필요한 내용 같이 느껴지기도 한다. 2. Personal Impressions 개념 소개 후 저자가 경험한 실제 사례들을 비교적 이해하기 쉽게 설명해주기 때문에 배운 내용의 필요성을 바로 공감할 수 있어서 좋았다. 리눅스에서 성능에 영향을 끼칠 수 있는 부분들에 대해 살펴볼 수 있었다. 메모리나 캐시의 특징, 디스크 IO, 네트워크 IO에 대해 다뤘다. 기본적인 개념 자체를 깔끔히 설명한다. 게다가 커널이 그런 리소스들을 어떻게 관리하는지까지 다뤄준다. 이 책 외에는 이런 내용들을 한 데에 모아 정리된 곳을 찾아보기 힘들다고 생각한다. 개념 소개 후 관련된 실제 사례들을 소개해주어 해당 개념의 필요성을 공감할 수 있었다. 마지막 챕터에서는 앞서 배운 내용들을 바탕으로 실제로 성능 개선을 해나가는 과정이 있는데 전체적인 내용 wrap up 겸 굉장히 좋았다. 개인적으로 실제 사례를 생략한 채 추상적인 얘기만 하거나 이론적인 내용만 다루는 책들을 싫어하는 편인데, 이런 관점에서 이 책은 꽤나 재미있었다. 다만 인프라가 클라우드를 바탕으로 고도로 추상화되고 있는 요즘 시대에 DevOps/SE에게는 이제 그닥 필요하지 않을듯한 내용까지 너무 자세히 다루는 점이 개인적으로는 오히려 좀 아쉬웠다. 예를 들어 로우 레벨의 깊은 코드단까지 살펴보면서 집요하게 설명하는 부분이 좀 불필요하고 지루하게 느껴지기도 했다. 각 장의 요약부분이 사실 굉장히 요약이 잘 되어있는데, 책의 내용이 다소 과하게 자세하고 깊다는 점을 고려했을 때, 요약만 읽어도 큰 문제 없을 듯하고, 그 경우 굉장히 효율적일 수 있겠다는 생각도 들었다. 따라서 책 전체를 읽기는 좀 지루할 것 같다거나 부담스러울 것 같다고 느껴지는 분들은 요약을 읽고 흥미로운 부분만 골라 읽어도 될 것 같다. 책에서 inode나 denti cache, filesystem 관련 metadata 등등 file system에 대한 내용들이 언급되었는데 이 내용들은 계속해서 내가 약한 부분 같아서 언제 한 번 살펴봐야겠다. 3. Summaries Chapter 1. 시스템 구성 정보 확인하기 시스템 구성 정보를 확인해보는 간단한 커맨드들을 소개한 장. cpu 정보는 /proc/cpuinfo 파일을 통해 확인 가능 free 명령어를 통해 시스템에 설치된 메모리의 크기, 사용 중인 메모리 등을 조회할 수 있음. df 명령어를 통해 시스템에 마운트된 블록 디바이스의 정보 확인 가능 /dev/sda - Old-SCSI-based Disk, 요즘의 SATA, SAS와 같은 일반적인 하드디스크 타입의 인터페이스를 이용하는 디스크 일반적으로 서버의 경우 RAID 컨트롤러를 통해 생성된 logical volume으로 존재함. /dev/hda - IDE-based disks /dev/vda - Virtual-hypervisor-based disks 디스크를 사용하려는 쪽과 실제 디스크 사이의 컨트롤러라는 부품이 있음. 이 부품의 타입은 IDE와 SCSI로 나뉨 IDE - 개인용 컴퓨터 SCSI - 서버용 컴퓨터, 더 많은 장치, 더ㅃ 빠른 접근 속도 ethtool을 통해 네트워크 카드의 정보 조회 가능 Chapter 2. top을 통해 살펴보는 프로세스 정보들 top 명령어를 통해 CPU, memory, swap 정보를 조회 가능 VIRT - 프로세스에 할당된 “가상” 메모리 RES - 실제로 메모리에 올려서 사용하고 있는 물리 메모리의 크기 SHR - 다른 프로세스와 공유하고 있는 메모리 VIRT는 엄청 커도 사실 문제 없을 수 있다. 중요한 것은 RES. RES가 너무 높으면 커널의 OOM Killer에 의해 프로세스가 종료당할 수 있다. Memory overcommit - 프로세스가 메모리를 요청할 때 바로 물리 메모리를 할당해주지 않고, 가상으로만 할당해주는 것. 그렇기에 할당된 메모리들의 합은 실제 물리 메모리의 크기를 초과할 수 있다.실제 물리 메모리 공간을 할당 받는 것은 해당 프로세스가 실제로 해당 메모리 공간에 접근하려할 때이다. 프로세스에는 스케쥴링 우선순위라는 것도 존재한다. 커널의 프로세스 스케쥴러는 이 우선순위를 참고해 프로세스들을 스케쥴한다. Chapter 3. Load Average와 시스템 부하 Load Average는 상태별 프로세스들의 개수들을 바탕으로 만들어진 값 프로세스가 갖는 상태의 종류 실행 중인 프로세스 실행 대기 중인 프로세스 IO 작업을 위해 대기 큐에 있는 프로세스 Chapter 4. free 명령이 숨기고 있는 것들 free 아웃풋에서의 buffers - 파일 시스템의 메타데이터 등을 저장하고 있는 블록 디바이스의 블록을 위한 캐시 free 아웃풋에서의 cached - I/O 작업의 효율성을 위해 한 번 읽은 파일의 내용을 저장하는 데에 사용하는 캐시 (Page cache) 여유 메모리가 없는 상황에서 다른 프로세스가 메모리 할당을 필요로 하면 커널은 buffers와 cached 영역의 메모리를 해제해 메모리가 필요한 프로세스에게 할당해준다. Chapter 5. swap, 메모리 증설의 포인트 swap 메모리란? - 물리 메모리가 부족한 경우 프로세스가 사용하는 메모리 중 우선순위가 낮은 영역을 물리 메모리에서 해제하고 디스크로 빼두는 영역. 이때 디스크 I/O는 메모리 I/O에 비해 월등히 느리기 때문에 시스템 전체(혹은 해당 프로세스)에 대한 병목이 될 수 있다. swap 영역이 조금이라도 사용되었다는 것은 어찌됐든 시스템에 물리적 메모리가 부족하다는 것이다. 어떤 프로세스가 swap 영역을 사용 중인지는 smem이라는 툴로 확인 가능. 커널 파라미터를 통해 swap을 사용할지 메모리 영역 중 페이지 캐시로 사용 중인 영역을 해제할지의 비율을 조절 가능 커널 파라미터를 통해 캐시를 더 많이 해제할지, 디렉토리 캐리나 inode 캐시를 더 많이 해제할지의 비율을 조절할 수 있다. Chapter 6. NUMA, 메모리 관리의 새로운 세계 ...

8월 28, 2023 · 9 분

[책] 유닉스의 탄생

시작하며 얼마 전 리눅스 커널의 동작을 설명하는 책을 읽고나니 살짝 내가 매일 사용하는 리눅스는 어떻게 탄생하게 된 걸지 궁금해졌었다. 회사에서 저녁을 먹고 나오는 길에 우연히 사내 책장에서 “유닉스의 탄생"이라는 책을 발견하게 됐고, 그 책을 읽어봤다. 책에 담긴 내용 간단히 정리 AT&T라는 미국의 회사 내에 존재했던 벨 연구소에서 어떻게 UNIX라는 운영체제가 탄생하게 되었는지 들어볼 수 있었다. 컴퓨터와 운영체제의 역사에 길이 남을 켄 톰슨, 데니스 리치, 더글라스 매클로이 등의 인물들에 대해서도 자연스레 알게 됐다. ...

1월 1, 2023 · 4 분

[책] 디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1편

시작하며 이 책을 읽기 전, 커널이나 운영체제는 나에게 꽤나 안개 같은 존재였다. 나는 클라우드 인프라를 다루는 엔지니어임에도 불구하고 커널이나 운영체제에 대해 제대로 알지 못하는 점이 약간 부끄럽게 느껴져 이 책을 통해 커널이 어떻게 동작하는지 좀 더 알아가고 싶었다. 책에 담긴 내용 간단히 정리 실제로 커널을 빌드하고 설치하는 방법 ftrace, trace32 등의 커널 개발, 디버깅에 도움되는 도구들 사용법 process나 thread 등의 개념이 실제로 구현된 자료구조 인터럽트가 발생하고 감지되어 처리되기까지의 일련의 과정 인터럽트 처리 기법 장단점 장점 실제로 커널을 빌드하고 설치해볼 수 있다! - 이 책을 읽으면서 수차례 커널을 빌드해볼 수 있었다. 만약 이 책이 없었더라면 어떻게 시작해야할지, 가능은 한 걸지 막연한 두려움에 쌓여있었을 수도 있었을 것 같은데 이 책 덕분에 어렵지 않게 직접 커널을 설치해볼 수 있었고, 몇몇 유용한 팁, 코드들을 얻을 수 있었다. 인터럽트가 어떻게 발생해서 어떻게 처리되는지 좀 더 구체적으로 알 수 있다. 여러가지 인터럽트 처리 기법에 대해 배워볼 수 있다. - IRQ 스레드, Soft IRQ, Work Queue등의 개념을 다룬다. 만약 이 책이 없었다면 이런 키워드를 얻는 것 조차 매우 힘들었을 듯하다. 인터넷 강의도 존재하고 저자분 블로그도 존재하는데 커뮤니케이션이 활발해 열심히 학습했다는 전제하에 그래도 모르는 게 있다면 얼마든지 여쭤볼 수 있다. 단점 (너무) 코드 위주의 자세한 내용이 많다. - 이건 단점이라기 보단 내 상황과는 조금 맞지 않았던 점이다. 처음에는 코드까지 까본다는 면이 되게 매력적으로 느껴졌는데 점점 너무나 깊은 심연을 탐구하게 되는 느낌이었달까… 일반적인 개발자, 엔지니어들에게는 다소 과하게 느껴질 만한 깊이인 듯하다. 중반 이후로는 실습이 별로 없고 인터럽트 후반부 처리에 대한 단순 나열이 많다. - 사실 나는 현재 데브옵스 엔지니어일 뿐 본업이 커널 개발자는 아니기에 애초에 이 책의 내용을 완~전히 이해하는 것을 목표로 하진 않았다. 디버깅 실습이 많다고 하니 ‘책을 슥슥 넘기지 말고 실습이라도 무조건 다 따라해보자!‘는 마인드였는데 중반부터는 인터럽트 후반부 처리 기법들이 등장하면서는 실습은 거의 없고, 해당 기법들을 각각 설명해나가는 내용이 주였다. 하지만 이 부분은 거의 나에게는 도움되지 않는 내용이었던 것 같아 결국 아쉽게도 뒷부분은 그냥 슥슥 읽고 넘어가게 됐다. 마치며 이 책은 커널에 대한 두려움을 없애줬고, 실제로 커널을 빌드하고 설치해보는 멋진 경험을 할 수 있게 해줬다. 이 책 덕분에 프로세스는 어떤 자료구조로 구현되어있고 어떻게 처리되는지, fork는 무엇인지, 스레드는 어떻게 구현되어있고 어떻게 처리되는지, 인터럽트는 어떤 흐름으로 발생되고 처리되는지를 한 번 더 공부해볼 수 있었다. 관련된 주제를 다루는 글들이 흔하다면 흔할 수는 있지만, 이 책처럼 자세하게 다뤄주는 경우는 없었기에 중반까지는 이 책을 참 재밌게 읽었던 것 같다. 하지만 인터럽트 후반부 처리 관련된 내용이 나오면서 머리가 어질어질해지고, 나랑은 좀 무관한 내용 같아서 좀 급히 책을 마무리하게 된 경향이 있어서 이 점은 조금 아쉽다. ...

12월 19, 2022 · 3 분

[책] 실습과 그림으로 배우는 리눅스 구조 리뷰

시작하며 Istio in Action을 읽고난 뒤에 리눅스나 커널에 대한 책을 읽어보겠다는 계획을 갖게 되었습니다. 정확히는 DevOps와 SE를 위한 리눅스 커널 이야기라는 책을 읽고싶었습니다. 기존에는 그 책이 사무실에 비치되어있었지만 이번에 사무실을 이사하면서 그 책이 어디갔는지 보이지가 않더라구요. 그래서 그냥 다른 책장에 비치되어있던 이 책을 읽어봤습니다. 다루고 있는 내용은 주로 리눅스 구조라기보다는 전반적인 컴퓨터 구조, 운영체제 같았습니다. 책에 담긴 내용 간단히 정리 커널의 역할, 운영체제의 역할이 무엇인지. 커널과 운영체제 및 드라이버들이 없다면 어떤 불편이 있을지 설명합니다. syscall, interrupt에 대해 이해하기 쉽게 설명하고 어떤 플로우로 동작하는지 설명합니다. CPU, 코어, 하이퍼 스레드에 대해 설명합니다. 메모리와 Virtual Memory, Cache, HDD, SSD의 특징과 어떻게 동작하는지를 설명합니다. fork & execve가 어떻게 동작하는지와 계층적인 리눅스의 프로세스 관계에 대해 설명합니다. 파일 시스템이 무엇인지, 파일 시스템이 없다면 어떠한 불편이 있는지 설명합니다. 장단점 장점 실제 코드와 그것에 대한 수행 결과, 개념을 나타낸 그림 등을 통해 이해를 돕습니다. 단순히 “이런 역할을 하는 녀석입니다.“로 설명이 끝나는 게 아니라 그 녀석이 없으면 어떤 불편이 있는지 예시를 들어줍니다. e.g. 디바이스 드라이버가 없다면 유저들은 작성하는 모든 프로그램에서 디바이스를 어떻게 제어할지를 구현해야할 것이고, 여러 프로세스가 같은 디바이스를 사용하려는 경우 어떻게 해야할 지에 대한 문제가 생길 것이다. e.g. 가상 메모리라는 개념 없이 물리 메모리를 직접 이용한다면 프로세스들이 실제로 자신의 물리메모리 주소를 관리해야하는데 이런 경우 다양한 어려움이 존재할 것이다. (너무 다양해서 이 글에선 생략.) 평소에 궁금했던 개념들, 내가 잘 알고 있는 건지 의문이 들었던 개념들, 이것까지 알아야하나싶은 개념들에 대해 한 번 가볍게 정리해볼 수 있습니다. 예를 들면 Page cache, Hyper thread 이런 개념들은 들어보기만 많이 들어보고 가볍게 알아볼 기회가 없었는데 이번에 가볍게 ‘아~ 이런 거구나~’ 해볼 수 있었습니다. 교수님께 배웠던 Virtual Memory 역할과 흔히 인터넷에서 Virtual memory를 설명하던 내용이 조금 달라서 내가 잘 알고있는 건지 의문이 들었는데 이런 의문도 해소가 됐습니다. 흔히 인터넷에서 봤던 Virtual memory의 역할은 Page라는 개념을 바탕으로 물리 메모리를 프로세스가 안전하고 편리하게 사용할 수 있도록 해주는 것이었습니다. 교수님께 배웠던 Virtual memory는 이뿐만 아니라 메모리를 demading page, swap 같은 응용된 내용도 있었습니다. 그래서 제가 인터넷에서 봤던 내용들이 맞는 건지 교수님께 배웠던 내용이 맞는 건지 궁금했는데 이 책 덕분에 ‘뭐 모두 맞는 내용 같다.‘는 결론을 낼 수 있었습니다. 단점 깊이가 깊진 않습니다. 깊이만 놓고 보면 학부생 수준의 컴퓨터구조, 운영체제 정도인 듯합니다. 번역이 조금 어색한 부분들이 종종 보였습니다. 마치며 ...

10월 9, 2022 · 2 분