프로그래밍에서 기초란 무엇인가?
나름 프로그래밍에서 기초란 코딩 간에 생성하는 데이터가 메모리에 할당될 때, 실제로 컴퓨터 내부에서 무엇이 어떻게 동작하는지를 이해하는 거라 생각했다.
놀면서도 컴퓨터과학 서적은 손에서 놓지 않았는데, 프로그래밍은 정말 눈꺼풀이 무거워서 감기지 않는 이상, 실력이 쌓였는지 알 길이 없는 분야인 거 같다. IT 보안 종사자로 코딩을 어느 정도까지 해야 한다는 딱히 기준이 없는터라, 파이썬만 잡고 리스트 / 딕셔너리 / 튜플 등의 문자열(string)과 달리 어떤 객체(다른 타입)도 될 수 있는 시퀀스(sequence)에 관한 내용만 허구한 날 붙잡고 있다.
근래에 보기 드문 컴퓨터 동작원리에 관한 해외원서가 번역된 것을 재작년에 광화문 교보문고에서 본 적이 있었는데, 도서관에서 다시 한번 회귀하게 되어서 제대로 탐독한 지가 한 달이 지났다. 영어강사가 영어는 5 형식만 알면 끝이다라고 하는 말이 허세가 아니다는 것을 깨달은 지금, 컴퓨터는 ‘비트 메모리’만 있으면 만들 수 있다는 말도 허세가 아니라 사실이라는 것을 이 책을 통해 알게 되었다. 비트 메모리의 정확한 이해에만 이틀 걸려 이후 이해의 속도가 빨라지는 가 싶더니, 가산기와 비교기 파트에서 주춤하여 다시 ALU(산술 연산 유니트) 장을 지나 끝까지 완독 하기만을 서너 번, 뭔가 아쉬운 게 남아서, 이제야 브런치에 수기로 올린다.
올리는 목적은 본인이 보고 무엇을 알고 있는지 모르는지 확인하고 정리하기 위해서이다. - ‘메타인지’의 실행
구글이 세계 최고의 검색사이트로 발돋움하는데 구글의 검색엔진이 야후보다 좋아서가 아니라는 것은 이전에 다른 섹션에서 언급한 적이 있었다. 소프트웨어 성능은 오히려 야후가 전문가 시스템으로 구글의 초창기 AI 수준보다는 월등했었다. 그럼에도 불구하고 구글이 야후를 제꾼 것은 그 AI 랭킹 시스템이 시간이 흐르면 흐를수록 사용자들의 선택을 더 많이 받았기 때문이기도 하지만, 데이터 센터에서 날마다 처리해야 할 유튜브 동영상 100억 건과 검색 350억 건(2018년 기준)에 대한 네트워크 대역폭의 확장이 가능했기 때문이기도 하다.
대역폭은 컴퓨터 네트워크나 인터넷이 특정 시간 동안에 보낼 수 있는 정보량인데, 통상 1초 단위로 표시한다. 구글의 기술 인프라 부문 수석 부사장인 우르스 회즐에 따르면, 이 수치는 앞으로 2년 안에 다시 10배로 늘어날 전망이라 했으므로 올해로 다시 유튜브 동영상 1000억 건과 검색 3500억 건의 데이터베이스 규모를 갖춰야 한다(현재 엑사에서 욥타 혹은 제타 바이트 수준 예상).
네트워크가 프로세서만큼 빨라질 때 컴퓨터는 텅 비고 모든 것은 네트워크를 통해 퍼져나갈 것이다. - 에릭 슈미트
1993년 선 마이크로시스템즈(지금의 오라클이 인수, 이하 '썬')의 최고 기술 책임자(CTO)이던 에릭 슈미트가 '구글의 종말'이라는 책을 지은 조지 길더 할아버지에게 보낸 위의 편지글의 발상을 '네트워크가 바로 컴퓨터다'라는 문구로 표현했다. 당시 썬의 하드웨어 책임자들은 핵심을 찌르는 슈미트의 전망을 제대로 받아들이지 못했고, IBM과 경쟁하기 위해 스팍(SPARC) 스테이션(32비트 마이크로프로세서이며 확장형 프로세서 아키텍처라는 뜻임.), RISC(CPU 명령어 수를 줄여 하드웨어 구조를 보다 간단하게 만든 컴퓨터), 자바 가상 기계(JVM, 컴퓨터 시스템을 여러 사용자가 동시에 사용할 수 있도록 마치 여러 대의 작은 컴퓨터 시스템이 있는 것처럼 분할하여 만든 것), 솔라리스 운영체제 등을 갖추었고 그 변화의 수혜자가 될 수 있다고 착각했었다.
그러나 슈미트(전 구글 CEO)는 얼마 뒤에 썬을 떠나 노벨(Novell)을 거쳐 구글에 합류해 곧 CEO가 됐다. 그리고 여기서 자기가 예견했던 미래(수익은 최고의 '네트워크'와 '검색 및 분류 알고리즘'을 갖춘 회사들에게 돌아갈 것)를 실현하기 위해 마이크로프로세서 분야의 스타인 인텔과 하드웨어 분야의 왕인 시게이트(Seagate)가 만든 값싼 부품들로 자기만의 서버를 설계하고 구축했다.
이러는 중 MS의 CTO인 먼디의 말마따나 프로세서 가격은 성능 증가량에 정비례해 높아지지 않고, 실제 가치보다 점점 더 높게(비선형적) 매겨지는 경향이 있어서 데이터센터를 증축하는 데에 있어서 난관에 부딪혔다. 결국 예산이 문제였는데, 기술적인 애로사항은 아래와 같았고 이것의 대한 해법은 '병렬구조 방식'이었다.
문제 : 보다 빠른 속도의 컴퓨팅의 요소는 CPU의 클럭 속도(CPU의 1 연산 주기당 속도는 헤르츠 혹은 초당 사이클로 표시, clock rate 또는 'tic tok')인데, 이 속도가 빠를수록 전력 소모량(돈)이 늘어남.
☞ 보다 많은 전력을 소모하지 않고도 클럭 속도를 높일 수 있는데(오버 클럭, 데스크톱 메인보드에서 CPU의 성능을 높이기 위해 점핑하는 것과 같은 원리), 전압을 낮출 수 있기 때문이다. 그러나 지금 양자 불확실성(quantum uncertainty)이 발생하는 수준의 전자볼트로까지 내려가 있기 때문에 더는 전압을 낮출 수 없다. 만일 전압을 더 낮출 수 없다면, 보다 많은 전력을 사용하지 않고서는(돈) 클록 속도를 높일 수 없다.
대응 : 클럭 속도를 높이면서 열 방출을 줄이는 것은 트랜지스터의 수를 크게 늘리는 것보다 더 어려움. 메모리가 마이크로프로세서(CPU)의 작동 속도보다 빠르게 증대할 때, 보다 빠른 마이크로프로세서라고 하더라도 메모리 액세스(로컬 메모리를 제공하는 속도)를 제대로 하지 못하는 경향이 있다. 구글 창업자인 래리 페이지가 CTO인 회즐을 재촉한 끝에 나온 해법은 '수많은 값싼 칩 프로세서들을 광섬유 선들로 병렬 결합해서 빛의 속도로 연결하는 것'이었고 새로 개발한 소프트웨어가 '이 프로세서들을 동시에 작동'하도록 만듦. 가성비가 줄어들지 않는 이 방식은 '확장성이 있는 시스템이 점점 성장한다 해도 적어도 이론적으로 가능'하였고 구현됨.
결과 : 슈미트의 통찰을 구현한 위의 "병렬구조 방식"은 오늘날 옳았음이 입증됐고 구글이 전 세계 독보적인 검색 사이트로 자리매김하게 함. 그는 구글은 다른 기업이 제공하는 상업적 데이터센터(AWS, MS, 에퀴닉스 등 클라우드 데이터 센터 운영업체)에 의존하지 않고 '독자적인 인프라'를 구축함으로써 독보적인 경쟁우위를 확보했다고 말함.
정리 : 구글은 데이터 저장과 백본(어떤 네트워크에서 다른 네트워크로부터 가장 많이 송수신 대상이 되는 트래픽의 주경로, backbone척추) 대역폭에 관한 한 기꺼이 낭비해왔으나, 가장 귀중한 자원들, 예컨대 웹페이지를 열거나 어떤 것을 검색할 때 그 결과가 펼쳐지기까지 걸리는 시간이나 그 시간을 기다려야 하는 사용자의 인내심에 관해서는 철저히 인색했다(웹페이지 로딩 시간에 집착, access time 1/20 sec.)
지금 구글은 램(Random Access Memory)을 대량으로 그리고 병렬적으로 배치함으로써 희소가치(시간)를 아끼게끔 '성능 최적화'를 이룬 IT 기업이다. 소프트웨어 회사로만 알고 있으면 오산이다. 구글의 성공 발판은 하드웨어의 성능 최적화를 통해서 네트워크의 횡단 대역폭(cross-section bandwidth)이라 일컫는 전송 규모가 페타바이트 수준을 넘어서는 거였다. 이 대역폭만 하더라도 구글이 검색하고 분류하고 채굴하고 현금화하는 전체 인터넷 대역폭의 몇 배 규모이지만, 지금은 이것도 결코 충분하지 않을 것이다.
구글의 ‘규모의 경제’ 구축 신화를 얘기한다고 서두가 꽤 길었다. 프로그래밍의 기초와 뭔 관계야 하며 여기까지 욕질하며 읽으신 분 중 혹 눈치 빠른 개발자라면 '메모리 액세스(로컬 메모리를 제공하는 속도)'라는 단어에서 프로그래밍 시 메모리 누수를 하지 않는 게 중요하다는 것을 아는 사람이 있을 거다. 병렬 처리는 '빌 댈리'라는 교수에 의해 창안된 이론이라면, 각각의 CPU가 NUMA(Non-Uniform Memory Access)라는 개념을 통해 멀티 프로세서 환경에서 메모리에 접근하는 방식이 현대 컴퓨터 메모리 사용 원리다. UMA(Uniform Memory Access)의 초창기 아키텍처와 반대되는 개념으로, 이것과 달리 로컬 메모리의 접근이 동시에 이뤄질 수 있다는 것이다.
위의 도식과 같이 네 개의 각 C1(CPU 1)이 자신의 로컬 메모리(Memory)에 접근하는 동안 C2, C3, C4도 자신의 메모리에 접근할 수 있어서 성능이 향상된다. 하지만 로컬 메모리의 양이 모자라면 다른 CPU에 붙어 있는 메모리에 접근이 필요하게 되고, 이때 메모리 접근에 시간이 소요되어 예상치 못한 성능 저하를 경험하게 된다. 그래서 로컬 메모리(stack)에서 얼마나 적게 메모리 접근(heap)이 일어나느냐가 성능 향상의 가장 중요한 포인트이자 일반 코더와 개발자와의 차이를 가늠하는 개념이다.
발췌 및 참고문헌
0) 강진우. (2017). DevOps와 SE를 위한 리눅스 커널 이야기 (pp. 106). n.p.: 프로그래밍 인사이트.
1) 조지 길더. (2019). 구글의 종말 (pp. 95-113). n.p.: 청림출판.
2) J. 클라크 스코트. 그래서 컴퓨터는 어떻게 동작 하나요. n.p.: 인사이트, 2019.
3) 반효경. 운영체제와 정보기술의 원리. n.p.: 이화여자대학교 출판문화원, 2020.
4) 정영훈 조성문. 파이썬 해킹 입문. n.p.: 프리렉, 2015.