2023 회고

2023은 나에게 어려운 한해였다. 인간의 빅데이터는 잘 틀리지 않는다. 보통 그것을 우리는 본능이라 한다. 나의 본능은 2022년부터 위험신호를 보냈다. 나는 인지했지만 충분히 내 능력이라면 이겨낼수 있을거라 생각했다. 그건 내가 잘못 생각한것이었다. 일과 사람은 뗄수없으며, 사람의 문제는 조직의 문제로 발전하고, 건강할수 없다. 그렇지만 나는 최선을 다했다. 그 최선은 나의 마음을 갈아넣는 것이었고, 내 마음 또한 한계가 오는 시점들이 있었다. 이 시점들을 지나고 보니 그게 나는 슬럼프인걸 알았다. 사람은 변하지 않고, 나는 타인을 변하게 할수 없음을 안다. 사람이 변하지 않으면 조직이 변하지 않고, 나는 조직을 변화시킬수 없음을 슬럼프가 다가 왔을때 느꼈다. ...

December 24, 2023 · 3 min · 📁 기타 · 🏷️ 회고, 2023

시작하는 엔지니어를 위해 - 3

https://linuxer.name/2020/12/%ec%8b%9c%ec%9e%91%ed%95%98%eb%8a%94-%ec%97%94%ec%a7%80%eb%8b%88%ec%96%b4%eb%a5%bc-%ec%9c%84%ed%95%b4-2/ 시작하는 엔지니어를 위한 글을 쓴지 벌써 3년이 지났습니다. 3년간 저도 성장했고, 더 나은 이야기를 할수 있는 사람이 되었는지도 모르겠습니다. 그럼 이야기를 시작하겠습니다. 먼저 스레드(Thread)를 이야기하려 합니다. 스레드는 사용자가 제어할수 있는 가장 작은 단위의 리소스입니다. 스레드는 프로세스 내에서 독립적인 실행 흐름을 나타내며, 프로세스의 리소스를 공유합니다. 말로는 이해가 안될 수 있으니 한번 프로세스와 스레드를 보여드릴까 합니다. [root@ip-172-31-37-46 ~]# ps afxuww | grep httpd root 2908 0.0 1.4 753824 14668 ? Ss Sep05 7:57 /usr/sbin/httpd -DFOREGROUND apache 24171 0.1 6.5 1121056 64932 ? Sl 13:24 0:02 \\_ /usr/sbin/httpd -DFOREGROUND apache 24215 0.1 6.5 891616 65076 ? Sl 13:24 0:02 \\_ /usr/sbin/httpd -DFOREGROUND apache 24226 0.1 6.1 891616 60412 ? Sl 13:24 0:01 \\_ /usr/sbin/httpd -DFOREGROUND apache 24227 0.1 6.5 891616 64672 ? Sl 13:24 0:01 \\_ /usr/sbin/httpd -DFOREGROUND apache 24298 0.1 6.0 891616 59792 ? Sl 13:24 0:01 \\_ /usr/sbin/httpd -DFOREGROUND apache 24602 0.1 6.5 893756 64920 ? Sl 13:38 0:00 \\_ /usr/sbin/httpd -DFOREGROUND apache 24603 0.1 5.9 815580 58600 ? Sl 13:38 0:00 \\_ /usr/sbin/httpd -DFOREGROUND apache 24615 0.1 5.9 815836 58988 ? Sl 13:38 0:00 \\_ /usr/sbin/httpd -DFOREGROUND apache 24640 0.1 6.2 815876 62040 ? Sl 13:38 0:00 \\_ /usr/sbin/httpd -DFOREGROUND apache 24674 0.1 6.0 891360 59644 ? Sl 13:38 0:00 \\_ /usr/sbin/httpd -DFOREGROUND ```bash . 저의 시그니처 명령어인 ps afxuwww 를 이용하여 프로세스를 확인합니다. ps afxuwww 명령어는 프로세스리스트를 모두 트리구조로 백그라운드 프로세스도 포함해서 유저 중심으로 넓게 보여주는 명령어립니다. 부모프로세스까지 합쳐서 12개의 프로세스가 구동중입니다. 그렇다면 이프로세스에는 몇개의 쓰레드가 있는지 확인해 봅시다. ```bash ps -eLf | grep httpd root 2908 1 2908 0 1 Sep05 ? 00:07:57 /usr/sbin/httpd -DFOREGROUND apache 24215 2908 24215 0 6 13:24 ? 00:00:02 /usr/sbin/httpd -DFOREGROUND apache 24215 2908 24216 0 6 13:24 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24215 2908 24217 0 6 13:24 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24215 2908 24218 0 6 13:24 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24215 2908 24219 0 6 13:24 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24215 2908 24220 0 6 13:24 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24226 2908 24226 0 6 13:24 ? 00:00:02 /usr/sbin/httpd -DFOREGROUND apache 24226 2908 24228 0 6 13:24 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24226 2908 24229 0 6 13:24 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24226 2908 24230 0 6 13:24 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24226 2908 24231 0 6 13:24 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24226 2908 24232 0 6 13:24 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24298 2908 24298 0 6 13:24 ? 00:00:02 /usr/sbin/httpd -DFOREGROUND apache 24298 2908 24308 0 6 13:24 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24298 2908 24309 0 6 13:24 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24298 2908 24310 0 6 13:24 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24298 2908 24311 0 6 13:24 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24298 2908 24312 0 6 13:24 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24602 2908 24602 0 6 13:38 ? 00:00:01 /usr/sbin/httpd -DFOREGROUND apache 24602 2908 24609 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24602 2908 24610 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24602 2908 24611 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24602 2908 24612 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24602 2908 24613 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24603 2908 24603 0 6 13:38 ? 00:00:01 /usr/sbin/httpd -DFOREGROUND apache 24603 2908 24604 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24603 2908 24605 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24603 2908 24606 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24603 2908 24607 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24603 2908 24608 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24615 2908 24615 0 6 13:38 ? 00:00:01 /usr/sbin/httpd -DFOREGROUND apache 24615 2908 24623 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24615 2908 24624 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24615 2908 24625 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24615 2908 24626 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24615 2908 24627 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24640 2908 24640 0 6 13:38 ? 00:00:01 /usr/sbin/httpd -DFOREGROUND apache 24640 2908 24654 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24640 2908 24655 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24640 2908 24656 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24640 2908 24657 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24640 2908 24658 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24674 2908 24674 0 6 13:38 ? 00:00:01 /usr/sbin/httpd -DFOREGROUND apache 24674 2908 24676 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24674 2908 24677 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24674 2908 24678 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24674 2908 24679 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24674 2908 24680 0 6 13:38 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24783 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24790 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24791 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24792 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24793 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24794 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24821 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24822 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24823 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24824 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24825 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24826 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24827 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24828 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24829 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24830 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24831 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24832 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24833 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24834 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24835 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24783 2908 24836 0 22 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24798 2908 24798 0 6 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24798 2908 24814 0 6 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24798 2908 24815 0 6 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24798 2908 24816 0 6 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24798 2908 24817 0 6 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 24798 2908 24818 0 6 13:47 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND ```bash . 총 77개의 스레드가 확인됩니다. 앞서 말했던것과 같이 스레드는 프로세스의 자원을 공유하므로 pid 가 같으면 같은 프로세스의 스레드라 할수있습니다. 그렇다면 각 스레드의 프로세스 갯수를 확인해 보겠습니다. ```bash ps -eLf | grep httpd | awk '{print $2}' | sort -n | uniq -c 1 2908 6 24215 6 24226 6 24298 6 24602 6 24603 6 24615 6 24640 6 24674 22 24783 6 24798 1 25189 ```bash . ps -eLf 명령어는 중요한부분은 L 옵션입니다. 스레드를 출력하는 옵션입니다. 그다음 명령어는 httpd 스레드의 2번째 행만 발라낸뒤 숫자로 정렬하고 유니크 명령어로 각 카운트를 세었습니다. 뭔가 연관성이 보이지 않나요? 6번째 행에서 보여주는 값이 프로세스내 스레드 갯수입니다. 이렇게 하나의 프로세스는 여러개의 스레드를 가지고있는 것을 확인할수 있습니다. 그럼 시작하는 엔지니어의 글을 작성한다고 했던 제가 왜 스레드니 프로세스니 하는 이야기를 하고 있을까요? 프로세스는 오늘 할 이야기의 시작이자 끝이기 때문입니다. 프로세스의 정의는 실행 중인 프로그램의 인스턴스입니다. 이는 코드, 데이터, 스택, 힙과 같은 메모리 영역, 파일 디스크립터, 환경 설정 등을 포함합니다. 운영 체제에서 기본적인 실행 단위로, 시스템 자원과 작업을 관리하는 데 사용됩니다. 이 프로세스를 격리하는 메커니즘을 Namespace 라고 합니다. 네임스페이스는 리눅스에서 프로세스를 격리하는 메커니즘입니다. 각 네임스페이스는 특정 종류의 시스템 자원을 감싸고, 프로세스가 그 자원을 별도로 보도록 합니다. 예를 들어, 네트워크, 파일시스템 마운트 포인트, 사용자 ID 등이 있습니다. 마지막으로 Cgroup 는 프로세스 그룹의 시스템 자원 사용을 제한하고 격리하는 기능을 제공합니다. cgroups를 사용하면 CPU 시간, 시스템 메모리, 네트워크 대역폭 등의 자원을 제어할 수 있습니다. 시스템 자원의 공정한 분배 및 특정 프로세스 그룹의 자원 사용을 제한하여 시스템의 안정성을 보장하는 데 사용됩니다. Namespace, Cgroup 이 둘은 함께 사용되어 프로세스의 격리 및 자원 관리를 향상시킵니다. 네임스페이스는 격리를 제공하고, Cgroup은 자원의 사용을 제한합니다. 이러한 조합은 효과적인 리소스 관리 및 격리된 환경을 제공하는 컨테이너 기술의 기반이 됩니다. 컨테이너는 가볍고, 이동이 쉬우며, 격리되고, 관리하기 편합니다. 컨테이너는 프로세스 입니다. 호스트 OS 내에서 앞서 보여드렸던, https 프로세스와 동일하다 보면 됩니다. 그러면 docker 에서 실행 중인 httpd 프로세스를 한번 확인해 보겠습니다. ```bash root 25830 0.3 0.8 711892 8832 ? Sl 14:22 0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 006385b1389ce918e596adf536fedbf68fcece03b9170cd898ccc70eb79a60d2 -address /run/containerd/containerd.sock root 25853 7.0 0.4 5860 4756 ? Ss 14:22 0:00 \\_ httpd -DFOREGROUND 33 25882 0.0 0.3 807096 3720 ? Sl 14:22 0:00 \\_ httpd -DFOREGROUND 33 25883 0.0 0.3 807096 3720 ? Sl 14:22 0:00 \\_ httpd -DFOREGROUND 33 25884 0.0 0.3 807096 3720 ? Sl 14:22 0:00 \\_ httpd -DFOREGROUND ```bash . Container Runtime (containerd-shim)이 실행한 httpd 컨테이너가 보입니다. 이렇게 보기엔 단순 프로세스 이지만 컨테이너가 실행한 httpd 프로세스 입니다. 앞서 보여드렸던 스레드도 비슷한 형태로 실행 중입니다. ```bash ps -eLf | grep httpd root 25853 25830 25853 0 1 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25882 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25940 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25941 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25942 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25943 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25944 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25945 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25946 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25947 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25948 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25949 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25950 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25951 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25952 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25953 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25954 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25955 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25956 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25957 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25958 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25959 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25960 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25961 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25962 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25963 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25964 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25882 25853 25965 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25883 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25914 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25915 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25916 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25917 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25918 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25919 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25920 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25921 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25922 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25923 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25924 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25925 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25926 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25927 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25928 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25929 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25930 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25931 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25932 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25933 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25934 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25935 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25936 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25937 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25938 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25883 25853 25939 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25884 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25887 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25888 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25889 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25890 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25891 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25892 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25893 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25894 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25895 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25896 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25897 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25898 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25899 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25900 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25901 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25902 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25903 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25904 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25905 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25906 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25907 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25908 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25909 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25910 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25911 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND 33 25884 25853 25912 0 27 14:22 ? 00:00:00 httpd -DFOREGROUND ```bash . 이과정에서 컨테이너는 프로세스다 라는 개념을 확실하게 알았을 것이라 생각합니다. 그럼 이제 이 컨테이너의 사용을 확장해 봅시다. ```bash docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 927717d2d026 httpd "httpd-foreground" 4 seconds ago Up 3 seconds 80/tcp stupefied_gagarin 182ddd3df992 httpd "httpd-foreground" 5 seconds ago Up 4 seconds 80/tcp relaxed_lovelace 4d50ad075f73 httpd "httpd-foreground" 6 seconds ago Up 5 seconds 80/tcp upbeat_goldwasser cfb8c7c071b0 httpd "httpd-foreground" 8 seconds ago Up 7 seconds 80/tcp crazy_chandrasekhar ```bash . ```bash root 26254 0.0 0.9 712212 9312 ? Sl 14:29 0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id cfb8c7c071b06dba1e760939d07649fd1e37a23df917c50002657ca04e0c3e9b -address /run/containerd/containerd.sock root 26276 0.7 0.4 5860 4700 ? Ss 14:29 0:00 \\_ httpd -DFOREGROUND 33 26305 0.0 0.3 807096 3664 ? Sl 14:29 0:00 \\_ httpd -DFOREGROUND 33 26306 0.0 0.3 807096 3664 ? Sl 14:29 0:00 \\_ httpd -DFOREGROUND 33 26307 0.0 0.3 807096 3664 ? Sl 14:29 0:00 \\_ httpd -DFOREGROUND root 26408 0.0 0.9 711892 9524 ? Sl 14:29 0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 4d50ad075f73631dfc8ae7c25130ef309857a0d4d300176f4571c5dd19fe1e9b -address /run/containerd/containerd.sock root 26430 0.7 0.4 5860 4636 ? Ss 14:29 0:00 \\_ httpd -DFOREGROUND 33 26458 0.0 0.3 807096 3792 ? Sl 14:29 0:00 \\_ httpd -DFOREGROUND 33 26459 0.0 0.3 807096 3788 ? Sl 14:29 0:00 \\_ httpd -DFOREGROUND 33 26460 0.0 0.3 807096 3792 ? Sl 14:29 0:00 \\_ httpd -DFOREGROUND root 26561 0.0 0.8 711892 8872 ? Sl 14:29 0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 182ddd3df992943a4f94d8455d5f535a66c6891b7151d5c1d60409f8085c8cc5 -address /run/containerd/containerd.sock root 26584 0.7 0.4 5860 4644 ? Ss 14:29 0:00 \\_ httpd -DFOREGROUND 33 26612 0.0 0.3 807096 3780 ? Sl 14:29 0:00 \\_ httpd -DFOREGROUND 33 26613 0.0 0.3 807096 3780 ? Sl 14:29 0:00 \\_ httpd -DFOREGROUND 33 26614 0.0 0.3 807096 3780 ? Sl 14:29 0:00 \\_ httpd -DFOREGROUND root 26715 0.0 0.8 712148 8640 ? Sl 14:29 0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 927717d2d02634bc6d4a31913356a2cb4aa08315ac1ed81e53d96861c46d816c -address /run/containerd/containerd.sock root 26738 0.7 0.4 5860 4812 ? Ss 14:29 0:00 \\_ httpd -DFOREGROUND 33 26767 0.0 0.3 807096 3696 ? Sl 14:29 0:00 \\_ httpd -DFOREGROUND 33 26768 0.0 0.3 807096 3696 ? Sl 14:29 0:00 \\_ httpd -DFOREGROUND 33 26769 0.0 0.3 807096 3696 ? Sl 14:29 0:00 \\_ httpd -DFOREGROUND ```bash . 4개의 컨테이너가 구동중이고, 각자 격리된 형태입니다. 자원만 충분하다면 컨테이너를 ulimit 에 설정된 openfile 이 받아주는 한계에서 굉장히 많은 컨테이너를 실행할수 있습니다. 컨테이너 네트워크또한 호스트와 분리한다면 더욱더 많은 컨테이너를 실행할수 있습니다. 이러한 컨테이너의 형태는 우리 엔지니어들이 입이 마르고 닳도록 말하는 kubernetes 와 연결되어있습니다. N+1개로 이루어진 Pod는 Node에 스케줄링됩니다. 위에서 예제로 보인 4개의 컨테이너의 실행은 네번이나 run 커멘드를 실행해야 하므로 아주 귀찮습니다. Kubernetes 에서 100개의 컨테이너를 생성하는 방법은 아래와 같습니다. ```bash apiVersion: apps/v1 kind: Deployment metadata: name: httpd-deployment spec: replicas: 100 selector: matchLabels: app: httpd template: metadata: labels: app: httpd spec: containers: - name: httpd image: httpd:latest ports: - containerPort: 80 ```bash . 이 매니패스트를 **kubectl apply -f httpd-deployment.yaml** 명령어로 실행만 하면 100개의 pod가 실행됩니다. 이제 로드벨런싱을 이야기해야 할듯한데 사실 이부분도 쿠버네티스의 오브젝트들이 적절히 잘 만들어져 있기에 간단히 할수 있습니다. ```bash apiVersion: v1 kind: Service metadata: name: httpd-loadbalancer spec: selector: app: httpd ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer ```bash . 이러한 형태로 선언만 하면 이제 끝입니다. 이런 방법으로 우리는 httpd Container를 쉽게 만들수 있습니다. 그럼 프로세스에 이어서 바로 쿠버네티스로 넘어왔는데, 뭔가 빠져있다 생각하지 않나요? 바로 노드입니다. 쿠버네티스는 컨테이너 오케스트레이션이라 불립니다. 연결된 Node에 API를 이용하여 애플리케이션과 서비스를 구성하고 관리하고 조정합니다. 드디어 오늘의 이야기의 핵심에 다가가고 있습니다. 쿠버네티스는 결국 리눅스에 설치됩니다. 우리는 Pod와 Service 오브젝트는 간단히 다룰수있지만 추상화의 너머에 있는 Kubernetes의 프로세스와 노드에서 돌고있는 Kubelet 에 대해선 간단히 다룰수 없습니다. ![](/images/2023/12/image-1-1024x490.png) POD/ Service / Deployment ![](/images/2023/12/image-2-1024x477.png) Control Plane (쿠버네티스 컴포넌트) 추상화된 그 너머는 파악하기도 쉽지 않습니다. <https://kubernetes.io/ko/docs/concepts/overview/components/> 우리는 다양한 것들이 추상화되어있는 시대를 살고있습니다. 그래서 그 심연을 들여다 보면 멘탈이 날아가는 일이 비일비재 합니다. 이러한 일들에 내성을 가지고 이겨내기위해선 결국엔 기본능력이 오르는 수밖에 없습니다. 기본능력이라 함은 리눅스 입니다. 항상 리눅스를 잘하려면 어떻게 해야하나요? 라는 질문을 듣습니다. 리눅서로서 사실 죄송한 말이지만 리눅스를 잘하는 기준은 어디에도 없고 리눅스 서버운영에는 많은 명령어가 필요하지 않습니다. 대부분 10개이내의 명령어를 사용합니다. 하지만 대부분의 일은 그 명령어들 내에서 처리됩니다. 그렇다면 리눅스를 잘하려면 어떻게 해야하냐? 결국엔 다양한 명령어들을 경험하고 손에 익어서 문제가 발생한 시점에 그 명령어를 사용해서 시스템을 점검하는것이 리눅스를 잘하는 것입니다. 저 같은 경우엔 처음보는 시스템도 30분이면 대부분 파악이 됩니다. 그 힘은 다양한 리눅스 환경에서 헤멘탓이 큽니다. 디렉토리 구조 패키지형태 명령어 스타일 배포판 마다 조금씩 다릅니다. 이런경우 저는 레드헷 계열 리눅스를 편하게 쓰지만 처음 보는 리눅스라 해서 어려워하지 않습니다. 이유는 간단합니다. 리눅스는 프로세스를 볼수 있습니다. 앞서서 이야기한 ps 명령어가 그러합니다 ps 명령어는 실행중인 프로세스를 면밀히 관찰할수 있게하고, 실행한 프로세스의 위치 ,구조, 사용중인 자원들을 볼수 있게 합니다. 시스템의 대부분의 힌트는 프로세스 리스트에 있습니다. 시작하는 엔지니어라면 리눅스의 구조 동작을 먼저 공부하시고 그 다음엔 명령어 프로세스 동작 그리고 간단한 스크립트도 짜보는것을 추천합니다. 또한 리눅스에선 다양한 명령어 들이 있습니다. 지금 이순간에도 누군가가 리눅스의 명령어를 만들고 있을 것입니다. 자신만의 명령어를 만들어도 좋습니다. 리눅스에 익숙해지고 많이 두드려 보세요. 손가락에 익은 명령어는 시스템을 배신하지 않습니다. ~~사실 가끔 합니다 (rm -rf \*) 과 같은..누구나 하는 실수입니다.(저는안했습니다.)~~ 기승전리눅스를 이야기하게 되었네요. 하지만 리눅스는 현대의 IT를 이끌고있는 근간이고 대부분의 시스템이 리눅스에서 구동된다는 사실을 안다면 근본인 리눅스를 하지 않을수 없다 생각합니다. 이제 제가 하려던 이야기를 다풀어 낸것 같습니다. 오늘도 읽어주셔서 감사합니다. **좋은밤 되시라!**

December 6, 2023 · 16 min · 📁 Linux, 기타 · 🏷️ 시작하는, 엔지니어를, 위해

개발자 두명이 자리를 바꾸는데 필요한 의자 갯수는?

보통 개발자의 자리이동은 세개의 의자가 있어야지만 가능하다. 빈의자 = 개발자1 개발자1 = 개발자2 개발자1 = 빈의자 ```bash 그런데 XOR를 이용하면 두개의 의자 만으로도 이동이 가능하다. ```bash 개발자1 ^= 개발자2 개발자2 ^= 개발자1 개발자1 ^= 개발자2 ```bash ![](/images/2023/08/image-1-1024x978.png) GPT의 답변이다. 나는 이런 방법이 있을거라 생각도 못했었다. 그러던중 현대의 컴파일러에선 XOR가 메모리를 사용하지 않지만 병렬처리에서의 문제로 성능이 떨어진다는 이야기를 들었다. ![](/images/2023/08/KakaoTalk_Snapshot_20230808_000456-1024x371.png) 항상 자세한 설명과 함께 도움주시는 pr0gr4m 님. 느려지는게 맞다고 하셔서 궁금해서 돌려봤다. ```bash import timeit # temp 사용 def swap_temp(): a = 5 b = 10 temp = a a = b b = temp return a, b # XOR 사용 def swap_xor(): a = 5 b = 10 a ^= b b ^= a a ^= b return a, b # 성능 테스트 temp_time = timeit.timeit("swap_temp()", setup="from __main__ import swap_temp", number=1000000) xor_time = timeit.timeit("swap_xor()", setup="from __main__ import swap_xor", number=1000000) print(f"Using temp: {temp_time} seconds") print(f"Using XOR: {xor_time} seconds") ```bash 코드를 여러번 실행해 봤고 결론을 얻었다. ```bash linus@Linusui-MacBookPro python % /opt/homebrew/bin/python3 /Users/linus/Desktop/python/test.py Using temp: 0.04701741598546505 seconds Using XOR: 0.06559245800599456 seconds linus@Linusui-MacBookPro python % /opt/homebrew/bin/python3 /Users/linus/Desktop/python/test.py Using temp: 0.04990166565403342 seconds Using XOR: 0.06569029204547405 seconds linus@Linusui-MacBookPro python % /opt/homebrew/bin/python3 /Users/linus/Desktop/python/test.py Using temp: 0.04502225015312433 seconds Using XOR: 0.0672295419499278 seconds linus@Linusui-MacBookPro python % /opt/homebrew/bin/python3 /Users/linus/Desktop/python/test.py Using temp: 0.045115040615200996 seconds Using XOR: 0.06622312497347593 seconds linus@Linusui-MacBookPro python % /opt/homebrew/bin/python3 /Users/linus/Desktop/python/test.py Using temp: 0.044884291011840105 seconds Using XOR: 0.06595424981787801 seconds linus@Linusui-MacBookPro python % /opt/homebrew/bin/python3 /Users/linus/Desktop/python/test.py Using temp: 0.04486312484368682 seconds Using XOR: 0.06613395782187581 seconds linus@Linusui-MacBookPro python % /opt/homebrew/bin/python3 /Users/linus/Desktop/python/test.py Using temp: 0.04502458404749632 seconds Using XOR: 0.06623658305034041 seconds linus@Linusui-MacBookPro python % /opt/homebrew/bin/python3 /Users/linus/Desktop/python/test.py Using temp: 0.044890208169817924 seconds Using XOR: 0.0665586250834167 seconds linus@Linusui-MacBookPro python % /opt/homebrew/bin/python3 /Users/linus/Desktop/python/test.py Using temp: 0.045562250073999166 seconds Using XOR: 0.06695195799693465 seconds linus@Linusui-MacBookPro python % /opt/homebrew/bin/python3 /Users/linus/Desktop/python/test.py Using temp: 0.04477795818820596 seconds Using XOR: 0.06620474997907877 seconds ```bash 아 궁금함이 풀렸다. 결론 ## **개발자 두명은 의자 두개로 자리 이동이 가능하지만 느리다.** 또, ![](/images/2023/08/KakaoTalk_Snapshot_20230808_092052-1024x760.png) Pr0gr4m의 추가 답변이 있었다. 알수록 어려운 컴파일러의 세계다.

August 8, 2023 · 2 min · 📁 기타 · 🏷️ XOR

CLOUDNET@ AWS네트워킹 강의 나눔이벤트

이번에 CLOUDNET@ 에서 인프런에 강의를 오픈했다. https://inf.run/Xpv1 1호 영업사원으로 뛰기로 말한 전적이 있기에 추첨으로 강의 나눔 이벤트를 했 총 60분이 참여해주셨고, 간단하게 코드를 짰다. import random def select_random_winner(filename): with open(filename, 'r', encoding='utf-8') as file: names = file.readlines() winner = random.choice(names).strip() return winner filename = "name_list.txt" winner = select_random_winner(filename) print(f"축하합니다! 상품 당첨자는 {winner}님입니다!") ```bash 랜덤으로 코드만들어서 돌렸다. ```bash python3 select_random_winner.py 축하합니다! 상품 당첨자는 김신님입니다! ```bash ![](/images/2023/04/image-2.png) 김신님께서 당첨되셨다. 축하합니다!

April 16, 2023 · 1 min · 📁 기타

2022 회고

2022년은 나에게도 많은 일이 있었던 해이다. 나는 네이버클라우드 솔루션아키텍트에서 밀리의서재 인프라스트럭처 엔지니어로 이직했다. 그사이에 책도 출간했다. 차도 샀다. 이직 후에 ISMS인증 심사도 받았다. 네이버클라우드에서는 나는 주로 설계를하고 내부적문제를 분석하고 에스컬레이션하는 업무를 맡았다. 그리고 CSAP 인증관련 프로젝트를 하며, 기약없는 나날을 보내고 있었다. 성장에 목이 말랐고, 뭘해야할지 모르는 안타까운 날들이었다. 회사의 성장은 느껴지는데, 나의 성장은 멈춰있는 느낌이었다. 문제는 회사가 아니라 나에게 있었다. 일상에서의 자극들이 아이디어와 성장으로 이루어지는 나의 방식이 알맞지 않았다. 또 기술적 성장을 더욱 하고싶었다. ...

December 26, 2022 · 1 min · 📁 linuxer?, 기타 · 🏷️ 회고

이런질문은 해선안됩니다.

January 25, 2021 · 0 min · 📁 기타

시작하는 엔지니어를 위해-2

시작하는 엔지니어를 위해-1 적은지 두달이 지났습니다. 다음편을 써야겠다 여러번 마음을 먹었지만 쉽지 않았습니다. 이전 주제는 엔지니어의 방향성에 대해서 이야기를 했습니다. 시스템 엔지니어와 클라우드 엔지니어의 차이 그리고 근본적인 핵심을 다루어야 한다는 이야기 까지요. 엔지니어로서 어떻게 하면 클라우드가 쉬워질까? 그리고 클라우드가 대세인 요즘 어떤 방향성을 가져야 할까? 를 적어보려 합니다. 먼저 클라우드는 마케팅 적 용어라 생각 합니다. 클라우드라 정의하고 이야기하지만 본질적으로는 컴퓨팅리소스를 임대하는 범주에서 벗어날수 없습니다. 물론 여기에는 많은 생략이 들어가 있기는 합니다. 하지만 클라우드가 대량의 컴퓨팅파워를 재 가공해서 판매하는 개념은 달라지지 않습니다. ...

December 26, 2020 · 3 min · 📁 기타

terraform-provider-ncloud-review

오늘 하시코프x네이버클라우드 웨비나에서 terraform 과 Vault 에 대한 웨비나를 청취했습니다. https://github.com/NaverCloudPlatform/terraform-provider-ncloud 이전에 방과후(?) meetup에서 네이버클라우드가 테라폼의 프로바이더로 있다는것을 알았습니다. 그 덕분에 네이버클라우드에서 terraform은 이미 경험이 있는 상태고, Vault도 경험이 있었습니다. 오늘의 주제 중 Secrets Engines이 궁금했습니다. https://www.vaultproject.io/docs/secrets Secrets engines are components which store, generate, or encrypt data. 시크릿엔진은 데이터를 저장또는 생성하고 암호화하는 구성요소. AWS 의 Parameter Store / Secrets Manager 와 비슷한 기능을 한다고 생각이 들었습니다. 다른 벤더에서도 비슷한 서비스들이 있습니다. ...

November 20, 2020 · 1 min · 📁 Linux, 기타, NCP · 🏷️ ncp, vault, navercloud

AI-speaker-identification-with-clovanote

오늘 클로바 노트 어플을 출시한걸 보고 사용해봤습니다. 클로바노트-아이폰 클로바노드-안드로이드 기능을 설명하자면 음성을 텍스트로 변환한다 ~ 이건 근래에 매우 일반화된 기능입니다.Speech Recognition 이라 합니다. 그런데, 이 어플은 음성->텍스트 변환 속도가 엄청나게 빠른것과 화자 구분기능이 있습니다. 화자 구분은 하나의 음성파일에서 각각 다른사람의 대화를 구분해주는 기능이죠. 이기능이 좋은이유는 장시간의 대화록에서 누가 어떤말을 했는지 각각 구분해 주므로 엄청난 편리성이 가미된것이죠. 위와같이 여러사람의 목소리를 구분해서 보여줍니다. 각각 벤더를 사용하시는 주변분들이 서비스에 대해 알려주셔서 찾아봤습니다. ...

November 19, 2020 · 1 min · 📁 기타 · 🏷️ clovanote, ai, 화자구분

naver-clovnote

https://apps.apple.com/gb/app/%ED%81%B4%EB%A1%9C%EB%B0%94%EB%85%B8%ED%8A%B8-ai-%EC%9D%8C%EC%84%B1%EA%B8%B0%EB%A1%9D/id1530010245 클로바노트앱 광고를 보고 바로 깔았다. 쓰자마자 생각이 들었다. 이거….미친거아냐? 와………………………………할말이 없을정도로 대단한 어플이다. 그냥 단순히 음성녹음 -> 텍스트 변환이아니라 사용자마다 목소리를 확인해서 각자다른 사람으로 인식한다. 그래서 이런식으로 말한사람을 분리하여준다…그저 기술의 혁명이 쩐다………………………… 진짜 엄청나네

November 19, 2020 · 1 min · 📁 기타