블로그
GPU·LLM·MLOps·쿠버네티스, 그리고 마음가짐에 관한 글 · 3704 편
#2026-03 762#culture 283#deep-dive 275#kubernetes 262#career 233#ai 223#llm 217#devops 198#2026-04 158#security 149#observability 118#database 113#communication 108#history 107#architecture 101#productivity 98#performance 93#linux 90#networking 89#finance 87#economy 84#mindset 80#psychology 79#ai-papers 78#food 78#it 78#travel 78#japanese 76#deep-learning 75#english 74#gpu 74#ai-agent 69#business-travel 69#postgresql 67#cs-fundamentals 63#rag 63#systems 63#python 56#learning 54#self-improvement 53
뉴턴은 왜 세계를 다시 썼나 — 사과, 프린키피아, 그리고 예측이라는 시험대
사과는 뉴턴의 머리에 떨어지지 않았습니다. 그 일화의 출처는 1752년 윌리엄 스터클리의 회고록이고, 여든셋의 뉴턴이 직접 들려준 이야기입니다. 페스트로 케임브리지가 닫힌 1665년의 기적의 해는 사실 20년에 걸친 작업을 한 해로 압축한 서사이며, 프린키피아(1687)는 핼리가 사비로 출판비를 댄 책이었습니다. 라이프니츠와의 미적분 우선권 전쟁, 케인스가 1936년 경매에서 사들인 연금술
2026-07-26 · 26 분 읽기 #humanities#science#history-of-science#newton#physics용량이 남았는데 No space left on device — inode 고갈, 삭제된 열린 파일, 예약 블록
df는 여유 공간을 보여 주는데 파일 하나를 만들지 못하고 ENOSPC가 납니다. 원인은 거의 항상 다섯 가지 중 하나입니다. inode 고갈, 삭제됐지만 프로세스가 열고 있는 파일, ext4의 예약 블록, 다른 파일시스템이 겹쳐 마운트되어 보이지 않는 파일, 그리고 컨테이너의 오버레이 상한입니다. 각각을 df -i, lsof +L1, tune2fs, 바인드 마운트로 어떻게 확정하고 무엇으로
2026-07-26 · 25 분 읽기 #linux#filesystem#ext4#troubleshooting#storage재즈는 어떻게 태어났나 — 콩고 스퀘어에서 Kind of Blue까지
재즈의 첫 번째 전설 버디 볼든은 녹음을 한 장도 남기지 않았고, 1917년 세계 최초의 재즈 음반을 만든 것은 백인 밴드였습니다. 프랑스와 스페인이 번갈아 지배한 뉴올리언스, 일요일마다 아프리카의 북을 칠 수 있었던 콩고 스퀘어, 유럽 음악을 정식으로 배운 크레올 연주자들, 그리고 이들을 흑인 밴드로 밀어 넣은 1894년의 인종 법령까지 — 블루스와 래그타임이라는 두 뿌리에서 시작해 루이
2026-07-26 · 28 분 읽기 #humanities#music#jazz#music-history#culture후추 한 줌이 세계를 연결했다 — 향신료 무역과 세계화의 원형
408년 로마를 포위한 알라리크가 요구한 몸값 목록에는 금과 은과 함께 후추 1360킬로그램이 있었습니다. 지금은 마트에서 몇천 원이면 사는 그 열매가 왜 그토록 비쌌는지, 그리고 상한 고기 냄새를 감추려고 썼다는 흔한 설명이 왜 근거가 약한지부터 짚습니다. 1498년 바스쿠 다 가마의 캘리컷 도착, 1602년 세계 최초의 주식회사가 된 네덜란드 동인도회사와 1621년 반다 제도 학살, 16
2026-07-26 · 29 분 읽기 #humanities#history#trade#globalization#colonialism돈은 물물교환에서 태어나지 않았다 — 리디아의 주화에서 신용화폐까지, 화폐의 세계사
경제학 교과서의 첫 장은 물물교환의 불편에서 화폐가 태어났다고 가르치지만, 인류학자들은 그런 사회를 아직 한 곳도 찾지 못했습니다. 기원전 7세기 리디아의 일렉트럼 주화, 11세기 송나라 사천에서 태어난 세계 최초의 지폐 교자, 포토시 은이 일으킨 16세기 가격 혁명, 1971년 8월 닉슨이 금 창구를 닫은 밤까지 화폐가 실제로 걸어온 길을 따라갑니다. 마지막에는 태평양 야프 섬의 거대한 돌
2026-07-26 · 29 분 읽기 #humanities#history#money#economics#financeOOM Killer가 프로세스를 죽였을 때 — dmesg 로그 해독부터 cgroup OOM 구분까지
프로세스가 아무 로그도 남기지 않고 사라졌고 종료 코드는 137입니다. 커널 OOM Killer가 남긴 dmesg 리포트를 한 줄씩 읽는 법, badness 점수가 계산되는 방식과 가장 큰 프로세스가 아닌 다른 프로세스가 죽는 이유, 시스템 전역 OOM과 cgroup v2 memory.max에 의한 컨테이너 OOM을 로그만 보고 구분하는 법을 정리합니다. overcommitmemory 0/1
2026-07-26 · 27 분 읽기 #linux#memory#oom#cgroups#kubernetesGit 내부 구조로 이해하는 명령어 — 객체, 참조, 인덱스로 다시 읽는 reset과 rebase
Git 명령을 외우면 매번 검색하게 되지만, 데이터 모델을 알면 명령의 동작이 추론됩니다. 이 글은 blob과 tree와 commit과 tag라는 네 가지 객체, 같은 내용이 언제나 같은 해시를 갖는 콘텐츠 주소 지정, 브랜치가 41바이트짜리 파일에 불과하다는 사실, 그리고 인덱스가 실제로 무엇을 담고 있는지를 cat-file과 ls-files로 직접 열어 보며 확인합니다. 이 모델을 알면
2026-07-26 · 20 분 읽기 #git#internals#git-objects#fundamentals#version-controlKubernetes OOMKilled(137) 메모리 문제 해결 — 한도를 올리기 전에 확인할 것들
컨테이너가 Exit Code 137로 죽었는데 애플리케이션 로그에는 아무 예외도 남지 않는 상황을 다룹니다. 137이 128 더하기 9, 즉 SIGKILL이라는 사실만 말해 준다는 점에서 출발해 컨테이너 cgroup 한계에 의한 OOM과 노드 전역 OOM, kubelet 축출을 dmesg 한 줄로 구분하는 법을 정리했습니다. JVM과 Node.js와 파이썬이 컨테이너 한계를 어떻게 오해하는지
2026-07-26 · 23 분 읽기 #kubernetes#oomkilled#memory#jvm#cgroupgit이 느려질 때 — 대형 저장소를 빠르게 만드는 구조적 처방
저장소가 느려지는 이유는 하나가 아닙니다. 커밋 이력이 긴 것, 파일 수가 많은 것, 큰 바이너리가 들어 있는 것은 서로 다른 문제이고 처방도 다릅니다. 이 글은 먼저 원인을 구분하는 측정 명령부터 시작해, 얕은 클론과 부분 클론이 왜 대체재가 아니라 용도가 다른 도구인지, sparse-checkout과 파일 감시가 status를 어떻게 줄이는지, commit-graph가 로그와 병합 기준점
2026-07-26 · 20 분 읽기 #git#performance#monorepo#git-lfs#version-controlgit 되돌리기 — 상황별로 고르는 restore, reset, revert, reflog
되돌리기 명령을 외우면 매번 검색하게 되지만, 무엇을 되돌리려는지 먼저 분류하면 명령은 저절로 결정됩니다. 워킹 디렉터리, 스테이징, 마지막 커밋 메시지, 커밋 자체, 이미 푸시한 커밋, 삭제한 브랜치까지 여섯 가지 상황으로 나누고 각각의 정확한 명령과 위험도를 정리했습니다. reset의 soft와 mixed와 hard가 HEAD, 인덱스, 워킹 트리 중 무엇을 옮기는지 표로 보여 주고, 푸
2026-07-26 · 19 분 읽기 #git#undo#reset#reflog#version-controlKubernetes CrashLoopBackOff 원인별 진단과 해결 — 로그가 비어 있을 때 무엇을 봐야 하나
파드가 CrashLoopBackOff에 빠졌는데 kubectl logs는 아무것도 뱉지 않는 상황을 처음부터 끝까지 다룹니다. BackOff가 원인이 아니라 10초에서 5분까지 늘어나는 재시작 대기 시간이라는 정확한 의미부터, describe의 Last State와 Exit Code를 읽는 순서, 종료 코드 0/1/127/137/139/143이 각각 무엇을 뜻하는지 정리했습니다. 애플리케이션
2026-07-26 · 21 분 읽기 #kubernetes#crashloopbackoff#troubleshooting#kubectl#sre바우하우스, 14년이 100년을 바꾸다 — 사물의 형태를 읽는 법
1919년 바이마르에서 문을 열고 1933년 나치의 압력으로 닫힌 바우하우스는 딱 14년 존재했습니다. 학생 수는 늘 수백 명 규모였고, 건축과는 개교 8년이 지나서야 생겼으며, 가장 많이 팔린 제품은 유명한 강관 의자가 아니라 벽지였습니다. 예비과정과 공방 체계, "형태는 기능을 따른다"가 사실 루이스 설리번의 말이라는 점, 여성 학생들이 직조 공방으로 몰릴 수밖에 없었던 구조, 폐교가 만
2026-07-26 · 28 분 읽기 #humanities#design#architecture#design-history#modernismDockerfile에서 반복되는 실수 — root 실행, PID 1, 이미지에 남는 시크릿
빌드는 통과하는데 운영에서만 터지는 Dockerfile 문제들을 원인부터 정리합니다. USER를 지정하지 않아 root로 도는 컨테이너, latest 태그와 재현성, ADD를 피해야 하는 이유, shell form CMD가 SIGTERM을 삼켜 배포 때마다 10초를 버리고 137로 죽는 구조, PID 1의 좀비 수확 책임과 tini, ARG와 ENV로 넣은 토큰이 docker history에
2026-07-26 · 20 분 읽기 #docker#dockerfile#container-security#pid1#devopsgit merge vs rebase — 무엇을 언제 쓰고, 공유 브랜치는 왜 리베이스하지 않는가
merge와 rebase의 차이는 그림이 아니라 커밋 해시로 봐야 정확합니다. 리베이스는 커밋을 옮기는 명령이 아니라 부모가 달라진 새 커밋을 만드는 명령이고, 해시가 바뀐다는 그 사실 하나가 공유 브랜치를 리베이스하지 말라는 황금률의 유일한 근거입니다. 이 글은 실제 커밋 해시와 reflog 출력으로 그 변화를 보여 주고, 머지 커밋이 소음이라는 통념을 first-parent 로그로 반박하
2026-07-26 · 19 분 읽기 #git#rebase#merge#version-control#workflow.gitignore가 작동하지 않을 때 — 원인 1위와 패턴 규칙 정독
무시 목록에 분명히 적었는데 파일이 계속 올라오는 이유는 대부분 하나입니다. 이미 추적 중인 파일에는 무시 규칙이 적용되지 않습니다. 이 글은 인덱스에서 빼는 정확한 명령과 그 명령이 동료의 작업 디렉터리에서 파일을 지운다는 부작용, 어느 규칙이 범인인지 Git에게 직접 물어보는 check-ignore 사용법과 추적 중인 파일에서는 아무것도 출력하지 않는 함정, 선행 슬래시와 후행 슬래시와
2026-07-26 · 19 분 읽기 #git#gitignore#troubleshooting#security#version-control컨테이너와 VM은 무엇이 다른가 — namespace, cgroup, 그리고 커널 공유의 청구서
"컨테이너는 가벼운 VM"이라는 설명이 왜 오해를 낳는지부터 정리합니다. 컨테이너는 namespace로 시야가 가려지고 cgroup으로 자원이 제한된 평범한 리눅스 프로세스일 뿐이며, 호스트 커널을 그대로 공유합니다. pid/mnt/net/uts/ipc/user/cgroup 네임스페이스가 각각 무엇을 격리하는지, cgroup v2가 무엇을 제한하는지를 실제 명령으로 확인하고, 커널 공유가 만
2026-07-26 · 23 분 읽기 #docker#container#linux-namespace#cgroup#virtualization도커 이미지 크기 줄이기 — 레이어의 진실, 멀티스테이지, 베이스 이미지의 실제 비용
도커 이미지가 1.9GB까지 부푸는 원인을 dive로 레이어 단위로 특정하는 법부터 정리합니다. 유니온 파일시스템 때문에 RUN rm 으로는 이미지가 한 바이트도 줄지 않는 이유, 멀티스테이지 빌드에서 정확히 무엇만 복사해야 하는지, alpine의 musl libc가 파이썬 휠 재빌드와 DNS 문제로 청구하는 숨은 비용, distroless와 slim의 트레이드오프를 실제 Dockerfile
2026-07-26 · 20 분 읽기 #docker#dockerfile#multi-stage-build#container#devopsEXPLAIN ANALYZE 읽는 법 — 실행 계획에서 진짜 병목을 찾는 순서
EXPLAIN ANALYZE 출력을 처음부터 끝까지 읽는 방법을 정리합니다. 노드를 어떤 순서로 읽어야 하는지, cost가 왜 시간 단위가 아닌지, 예상 행 수와 실제 행 수의 괴리가 무엇을 알려 주는지, loops가 곱해지는 함정은 어떻게 피하는지 실제 출력과 함께 설명합니다. Nested Loop, Hash Join, Merge Join이 각각 선택되는 조건과 BUFFERS로 캐시 적중을
2026-07-26 · 21 분 읽기 #database#postgresql#explain#query-optimization#performance도커 빌드 캐시가 자꾸 깨지는 이유 — 레이어 캐시 키, ARG, BuildKit 캐시 마운트
코드 한 줄만 고쳤는데 npm ci가 5분 동안 다시 도는 문제의 원인을 캐시 키 수준에서 설명합니다. RUN의 캐시 키는 명령 문자열이고 COPY의 캐시 키는 파일 내용 해시라는 차이, 한 레이어가 깨지면 그 아래가 전부 깨지는 규칙, ARG가 BuildKit과 구 빌더에서 다르게 동작하는 지점을 다룹니다. CI 러너에는 캐시가 없다는 사실과 함께 캐시 마운트가 레지스트리 캐시로 내보내지지
2026-07-26 · 18 분 읽기 #docker#buildkit#build-cache#ci-cd#devops트랜잭션 격리 수준과 실제 이상 현상 — 표준 정의가 구현과 다른 지점
트랜잭션 격리 수준 네 가지와 dirty read, non-repeatable read, phantom read를 정리하되, 교과서의 표 하나로 끝내지 않습니다. PostgreSQL의 Read Committed가 왜 처음부터 dirty read를 만들 수 없는지, Repeatable Read가 왜 사실은 스냅샷 격리이고 직렬화 실패를 애플리케이션이 재시도해야 하는지, MySQL InnoDB의
2026-07-26 · 22 분 읽기 #database#postgresql#transaction#isolation-level#mysql