12시간 이상 잤다. 바로 전에 43시간 이상 꼬박 밤새고 쓰러지듯 잔 것이다.
알콜을 한 방울도 마실 수 없는 초건전한 몰몬교도들의 본거지인 유타 주에 가면 Zion National Park가 있다. 거기에 16마일정도 되는 계곡이 있는데, 여기 트래킹은 기억에 남을만한 추억을 안겨준다.
가볍게 트래킹을 준비하면서 거의 조난당할 뻔한 기억과 누군가의 조난을 구한 기억이 지금의 유로존 사태와 서브프라임 모기지. 그리고 2주 동안 250시간 밤샘 프로젝트가 오버랩되었다.
그것은 바로 "탐욕"과 "원칙의 포기"라는 것이다.
날씨가 안 좋다는 일기 예보를 보았지만, 돈이란 돈을 긁어모으고 성공의 직전에 있던 황금 양말의 개발자들과 금융가들은 자기들의 두뇌를 믿었다.
계곡 트래킹으로 가는 길에는 가벼운 빗방울이 떨어지고 있었지만, 그것이 얼마나 큰 일을 예감하는지 잘 몰랐다. 가볍게 농담으로 계속이 거대한 물줄기에 잠기면 어쩌지? 라는 농담과 무한대의 알콜이 흡입되었다. (당연히 음주 운전이였다...)
Virgin River가 흐르는 잔잔한 계곡에 들어서자, 우리는 대자연의 장엄함에 압도되었고 그 동안 무한 밤샘과 노가다로 인한 스트레스는 대자연의 아름다움으로 잊었다. 금융가들의 세컨드로 추정되는 제키, 제니퍼 등등 이름도 기억할 수 없는 금발의 아까씨들도 제잘거리며 서로 친구가 되어 있었고 우리는 탐험을 시작했다.
한시간 쯤 걸어갔을 때 한두방울 떨어지던 빗방울은 뺨을 타고 흐를 정도가 되었다. 계곡에서 물이 쓰나미처럼 밀려온다는 지식을 어디선가 들었던 개발자 nerd들은 조심스럽게 위험하지 않냐고 했지만, 혈기 왕성한 도전자들에 의해 무시되었다.
발목에 찰랑거리던 강물은 어느새 무릎까지 차올랐고, 거대한 폭포소리와 같은 물소리가 울려퍼졌다. 자신 만만하던 도전자들도 당황하기 시작했다. 우리는 탈출구를 찾아 동료애도 내던지고 레이디 퍼스트 정신도 내던지고 계곡 벽을 기어오를 곳을 찾아 달리기 시작했다.
운좋게도 나는 2~300미터 전에 사람이 거어 올라갈만한 길을 기억해냈고 그 생각은 옳았다. 내가 먼저 기어 올랐고 "this way! come on~!!!"이라고 소리쳤다.
그리고 그들은 내가 찾은 탈출구쪽으로 몰려들었다. 상대적으로 안전한 나는 "lady first!!!" 나는 이리 소리쳤지만, 아래는 아비규환. 밀칠 수 있는 힘만이 존재했다.
여자들은 거의 마지막에야 올라갔고, 일부 양심적인 nerd와 젠들맨이라 불렸던 제프리가 여자들이 미끄러지는 걸 올려주면서 탈진한 채 가장 마지막에 올라왔다.
계곡을 덥친 물은 그 후로 일이십분 뒤에 밀려왔다.
긴장이 풀린 전직 탐험가들은 가벼운 농담과 알콜을 흡입했지만, 찜찜한 기분은 떨칠 수 없었나보다. 결국 몇몇 커플은 비열한 남자들의 행태를 두고 싸웠다. 그리고 여행이 그들의 끝이 되었다.
우연일지 모르지만, 제대로된 남자인 제프리는 승승장구하여 모 회사의 이사회에 들어갔다고 한다. 나머지는... 그저 nerd로 있거나 서브 프라임 모기지의 폭풍 때 resume를 써야하는 처지가 되었다고 전해진다.
이번 프로젝트는 내가 제안 받았을 때 3월이였다. 물론 바쁘고 mmorpg 오픈이 얼마 남지 않는 모 코스탁 게임 회사 이사인 나는 바쁘기도 해서 거절한 프로젝트였다. 조언을 했을 때 기간이 짧으니 "엔진"을 가지고 "C++" 혹은 자바로 서버 엔진이 있는 팀에서 해야한다는 것이였다.
급하게 한국으로 소환되어 본 결과는 모든 전제가 무너지고 웹 기반의 프로젝트였다. 그것도 리얼타임을 고려하지 않고 만들었다가 리얼 타임을 고려해야하는 처지였다.
서버 당 동접은 10명이였다.
더구나 클라우드 서버는 종종 정신줄을 놓고 장애를 일으키기 일쑤였다. 그리고 서버는 해킹을 당하고 있었다.
나에게는 사기가 엉망이 된 외주 팀 4명과 앞으로 일주일의 시간이 있었다. 누더기기이 3천 라인이 넘는 소스와 문제를 분석할 시간 조차 없고 예산도 제대로 할당되어 있지 못했다.
그리고 나는 내 특기인 '마공'을 쓰기 시작했다.
필요한 서버를 3배로 잡고 장비를 넣자고 했다. 예산은 내 주머니에서 가집행되었고, 4일 후 목요일에야 장비가 셋팅되었다. 대기업 서브 도메인으로 셋팅된 클라우드 웹 서버는 두고 두고 나의 발목을 잡았다. dns셋팅에 보통 회사는 십분이지만, 아웃소싱을 멀리 영어가 되는 저렴한 국가로 이전한 대기업에서는 1주일이 넘는 일이였다.
젠 서버 기반의 클라우드 웹 서버는 백본에서 10Gbps 회선이 내려오고 서버로 2Gbps가 열린다고 했다. 이 정도면 견딜 수 있는 양이라 생각했다. 물론 이는 실제 테스트에서 거짓으로 드러났다.
우선 급하게 프로파일링을 시작했다.
IIS + SSO(asp) + fast CGI(PHP) + mysql(리눅스 서버)
문제는 클라우드 서버와 리눅스 서버가 각각 다른 idc에 있었고 디비 서버는 충분한 대역폭이 없고 단순하게 커넥팅만 30ms 이상이였다.
서버를 몰아 넣기로 한 시점에서는 같은 idc에서 서버로 이전되면 시차 문제는 충분히 커버될 것 같았다.
디비는 혹시나 몰라 32코어, 메모리 16GB, SSD로 뽑았다. 이유는 모르지만 경험에서 나온 넉넉한 하드웨어 스팩은 두고 두고 좋은 결정이 되었다.
프로파일링 결과는 말도 안되는 쿼리가 오고가고 미리는 현상과 fast CGI와 my-sql이 connection time_wait였다. 1유저가 접속할 때 time_wait가 백여 개 이상 뜨는 현상이 발견된 것이다.
그래서 윈도우 2008 서버의 time_wait 셋팅과 connection pool, IIS time_wait 셋팅을 변경했다.
하루 동안 동접은 2배.. 20명으로 올라갔다.
불필요하게 빠른 시간으로 호출되던 쿼리와 타이머를 조정했다. 작업 3일 째, 동접은 처음보다 4배... 동접 50으로 올라갔다.
'갑'이 원하는 동접은 1천명.
1Gbps dedicated 회선에 8 core 서버가 들어오기 시작했다. 불완전하지만 서버 당 동접 1백명 수준이 되었다. 유저 튕김 현상은 여전히 발생.
금요일. 요청한 dns가 제대로 할당되지 않았다. 대기업 산하 전산 회사는 dns가 되었다고 말했지만, nslookup에서는 여전히 뜨지 않았다.
하루에 20시간 일하는 상황에서, 비몽사몽한 상태에서 플랜 B 작업이 진행되었다. 7대의 서버가 도메인 없이 동작하도록 구조가 변경되었다. 로그인이 필요했는데 도메인이 다르거나 IP로 되어있으면 로그인이 안되는 구조였다.
무림 절세 고수 2사람이 DB와 php, java script를 튜닝했다. 외주사가 좀 특이해서인지 모르지만 밥시간이 지나도 밥을 제대로 주지 않았다. 기껏해야 하루 한끼 정도 먹여 주었다.
편의점 죽도 처음 먹어봤다... 그리고 외주처에서 밤샘하면서 내 돈 주고 '병' 개발사 직원과 나와 내 팀의 밥값을 여러 차례 내가 낸 건 처음이다.
아무래도 개발자들의 뱃살을 빼주기 위한 '갑'과 '을'의 다이어트 계획이였는지도 모른다. 우리가 모르는 심모원려라 생각해주자.
그리고 이 순간까지 내 외주비는 계약금조차 받지 못했다는 점은 한국 일을 때려치게 만드는 원인이 되고 있다. 프리랜서들은 돈을 못받을까바 '병'에게 외주비 계약금을 달라고 아우성이다. '병'은 병대로 돈 떼어먹을 회사가 아니니 안심하란다. 서로 믿지 못하는 상황이 평행선을 달린다.
작업 6일 째, 밤샘 120시간째... 토요일 소스를 건들면 안되는 시간이 되었지만 코드를 건들고 있다. 튜닝도 하고 있다.
php와 my-sql의 connecton time_wait가 기하급수적으로 늘어나 socket을 더 이상 열 수 없는 상황이라는 판단이 되었다.
그리고 my-sql이 더 이상 리퀘스트를 못하는 상황이 발견되어 튜닝했다. myisam인 상태였다. 이노디비와 my-sql 버전업이 필요했지만, 기술문서나 구글링을 해도 확신을 할 수 없는 상황이였다. 디비 서버의 cpu 점유율은 20%를 넘겼고 코어 하나 기준으로 100% 근방까지 갔다.
물론 서버를 넣은 idc 측 엔지니어가 디비를 튜닝했다고 말했지만, 거짓이였다. 밤샘 끝에 나 역시 확인하지 못했던 것이다.
튜닝을 통해 문제를 일부 해결했다. 유저 1명 당 커넥션당 10여개의 time_wait로 줄였다. 이 부분은 10여일 뒤 MS의 패치 이후로 이유는 명확하지 않지만 알 수 없는 문제로 다시 늘어나는 상황이 되었다.
일요일 오전 10시. 튜닝이 대강 끝났다. 무림 은자 고수는 디비로 오고 가는 데이터를 php 웹 서버 레벨에서 메모리 캐싱으로 처리했다. 원래 게임 서버와 같은 네이티브 환경에서 할 일은 웹서버 코딩으로 한 것이다.
목요일부터 포항의 모 공대로 추정되는 인간들이 디비가 궁금한지 자주 방문 인사를 해서 제대로된 경고를 보냈다. 그들에게 rm과 dd가 뭔지 알려줬다.
웹 서버 백신 및 간단 방화벽으로 사용한 시멘텍 endpoint가 php-cgi에 대해서 과대한 트래픽이 오면 디도스로 간주하고 drop 시키는 걸 발견했다. 예외 처리에 걸었지만동일한 결과...
시멘텍에 물었지만 대답이 없었다. 다시 마공을 썼다.
작업 7일째, 일요일. 오후 5시. 여전히 코딩이 진행되었다. 개발 원칙이 깨지고 있다. 다들 20시간 이상 시체라 효율이라고는 찾아볼 수 없는 죽음의 행진이다.
결국 절대 고수 역시 DB 비번을 잘못 입력하는 사태가 발생. 오픈 데드라인을 넘겼다. 그를 탓하기에는 절대적으로 밤샘과 무리한 작업의 여파였다.
초빙한 절대 고수에게도 작업 7일이 지난 시점까지 계약금조차 지급되지 않았다.
7시 30분 오픈.
클라우드 서버는 쓰나미를 만났다. 정상적으로 로그인은 되지 않았고, 수만 명의 유저들은 접속을 하지 못했다. 클라우드 웹 서버는 cpu 100%를 채우고 응답할 수 없는 지경에 이르렀다.
실패했다...
원인 분석이 된 스샷과 증거는 실시간으로 고객사에 전달되었다. 10시 30분. 대책 회의가 소집되었다. 나는 40시간 이상 잠을 자지 못한 상태였다. 그때 처음 일요일 첫 음식을 미지근한 샌트위치 하나로 때웠다.
나는 서비스를 살릴 수 있다고 말했고 충분한 자원을 더 투입하면 된다고 말했다. '갑'은 어마어마한 불만이였고 난상토론을 했다. 결국 물러설 길이 없던 사람들은 7월 8일 이벤트를 2시간 간격으로 2번 하기로 하고 일을 진행하기로 했다. 플랜은 A와 B를 요구했다.
무한 밤샘이 시작되었다. dns는 여전히 사람을 열받게 하고 클라우드는 정신줄을 놓아 새로 설치했다. 클라우드 서비스의 고객 응대는 심야에 이루어지지 못했고 한국 초일류 기업은 그저 변명만 했다. 웹 서버의 로그 파일 자체가 쓰기 에러로 써지지 않았고, 커널에서 커널 에러가 줄줄히 난 사태는 그냥 웹 서버 에러일 것이고 클라우드 버그가 아니라고 말했다.
내가 바로 그 회사 클라우드 서버로 이루어진 포털을 리얼 서버로 바꾼 인간이라고 말하는데 내게 계속 거짓말을 했다.
시간이 없어서 새로 서버를 받았다. dns 꼬인 셋팅 때문에 클라우드를 버릴 수 없었다. 클라우드 서비스에서 지난 일요일 mrtg를 요구했지만 mrtg 서비스 신청이 없었기 때문에 기록되지 않았다고 한다. 라우터에 붙은 mrtg를 보여달라고 했지만 응답이 없었다. 단지 1시간 동안 100GB 데이터를 썼다고 말했다. 믿으라고?
2Gbps 데디케이트로 열린 클라우드 서버가 단지 2~5mbps가 최대 대역폭이라는 것을 파일을 다른 1gbps 서버에서 파일을 보내다 확인했다. 따지다가 질렸다. 따질 시간조차 우리에게는 없었다. 그들은 정규적이 아니라 외주 하청직이였다. 결국 전화가 돌다돌다 본사 클라우드 전문가가 말도 안되는 메일을 보내왔다. 싸울 힘보다 구조적인 문제에 절망했다. 그들 잘못이 아니지 않은가... 그런데 고객은? 무슨 잘못인가?
dns 라운드 로빈이 되었다. 우리에게는 8 core / 8GB / SSD/ 1Gbps dedi 서버와 장애 투성이 클라우드 서버가 있게 되었다.
서버가 dns 라운드 로빈으로 묶이다보니 디버깅에 애를 먹었다.
목요일. 7월 5일 플랜 A는 포기되었다. 웹 서버 디버깅을 위해 상단에 서버 아이피 하나 넣은 걸 고객사에서 삭제해달라해서 어쩔 수 없게 삭제했다. 디버깅은 점점 힘들어졌다. 밥은 하루에 한끼. 밤에는 과자 부스러기 먹는 것이 전부였다.
먹으면 잠을 졸 것이 걱정이였는지 뱃살을 빼주려는 의도였는지 지금도 모르겠다.
서버 당 동접이 200 수준까지 증가되었다 RFP를 맞출 수 있다.
잠을 자서 금요일 새벽 1시에 집밥을 맛있게 먹었다.
서버 패치 후 제대로 동접이 나오지 않는다. 아니 무언가 수정되었는지도 모르겠고 그토록 괴롭히던 time_wait가 유저당 100개로 뜬다. 소켓이 고갈되어 다운된다.
생각해낼 수 있는 마공은 몇가지... 비몽사몽에 그 동안 밤샘으로 실뢰할 수 있는 코딩이 나는 불가능했다. 이 안에서는 불가능했다.
절대 고수가 토요일 9시에 도착했다.
말도 안되는 이 상황. 구글링에도 안나오고 기술 문서에도 안나오는 상황을 이해 시키기 위해서 2~3시간 튜닝 과정을 하도록 했다.
결론은 역시 php / ii -> my sql 사이에 time_wait 쓰레기 커넥션을 끊어주고 커넥션을 유지해주는 프록시 서버.
코딩 허용 시간은 4시간.
절대 고수는 코딩을 시작했다.
2시간 후 그는 결과물을 내놨다.
더운 사무실 회의실(사무실로 썼다) 밖에 쾌적한 사무실에 보니 '을'로 계시는 많은 분들이 드라마를 보거나 게임을 하시고 한가했다. 개발자들은 단식중이였지만, 그들은 파자 등 야식을 시켜 드시고 만빵 체력을 가지고 계셨다.
좀 많이 욱컥 화가 났다.
그래서 이 결과물을 가지고 무엄하게도 '을'과 '병'을 동원해서 동접 테스트를 하기로 했다. 정확한 테스트를 위해서 PC방으로 출발...
프록시 서버가 예상과 달리 다운되었다. ㅠ_ㅠ
디버깅을 해보니 프록시 서버의 클라이언트 사이드 모듈에서 socket memory leak...
그리고 디비는 이노디비가 올라갔지만 myisam 상태로 최적화가 되지 않았다. idc 엔지니어가 우리의 명줄을 끊어버린 것이였다. 체크를 크로스로 못한 내가 잘못이였다.
희망... 이라는 단어가 사라졌다. 이제는 거의 남겨진 시간이 없는 가운데서 남겨진 마공 C / 마공 D만 남았다.
해가 떴고 아침 10시 반 '을'은 내게 짜증을 냈다. 물론 그와 6명은 이 프로젝트가 망하면 사표를 내야하는 처지였다. 그를 이해한다.
그 때 무림 절대 고수 웹 개발자가 time_wait 문제에 대한 방법을 찾았다. 내가 수요일 밤에 그에게 이야기한 것인데 ㅠㅠ 그는 영웅적 기질이 있던 것이였다.
처리가 되었다.
문제는 디비 처리가 한계점이라는 것이였다.
개발자들을 이끌고 중국집에서 피로에 쩌든 개발자 7명과 식사를 하고 내가 돈을 내고 나는 30~40분 쇼파에서 쓰러졌다. '갑'과 '을'은 내가 이틀 동안 1시간도 잠못잔 걸 아는데 마구 힘들어 깨웠다.
아무런 생각이 들지 않고 마공을 쓸 힘조차 없다
정신을 일어나보니 프록시를 만들었던 고수가 디비를 이노디비 + 메모리로 올린 것이 아닌가... 스트레스 테스트를 해보니 만족할 결과가 나왔다.
기적이 일어났다...
일요일 오후 2시.
여전히 디자인이 수정되고 있다. 3시에는 클로징이 되어야할 작업이 오픈 직전까지 계속되었다.
IDC에 연락을 해서 긴급 대응고 충분한 회선을 상의하고 클라우드 업체에도 그랬다. 그리고 충분히 받지 못하는 클라우드 대역폭을 임의로 계약 용량 만큼 임의로 수정했다. 그들이 무능하니 장비 셋팅을 내가할 수 밖에...
4시 서비스가 시작되었다.
유저들이 저글링처럼 몰려온다....
계약한 어마어마한 회선과 서버에서 다운 없이 트래픽을 받아준다.
그리고 디도스가 들어오기 시작했다.
300Mbps로 웹 서버로 들어오는 디도스를 막았다. 장비와 회선의 힘이다. 아이러니하게도 time_wait 셋팅이 디도스의 특효로 작용했다.
8시 30분...
2차례 이벤트는 무사히 종료되었다.
박수 갈채를 받았다.
'을'이 밥을 사준다고 잠시 기다리라고 했다.
한시간을 기다렸지만, '갑'과 '을' <->'병'의 이야기는 끝이 없다. '을'은 '갑'에게 접대를 해주기 위해 나가서 법인 카드가 없어 개발자들의 저녁 회식은 다음으로 밀렸다고 한다.
지친 나는 프록시를 만든 개발자와 나와 밥을 먹이기 위해 나왔다. 먹을 곳이 다 닫혔다. 점심에 갔던 중국집으로 가서 짜장면을 먹이고 보냈다.
집에 와서 11시 반 밥을 먹고 내리 잤다.
그리고 나는 아직까지 외주비를 받지 못했고 이 프로젝트 내부에는 여전히 문제가 많으며 '갑' '을' '병' '정(원래 개발사)', 그리고 프리랜서 사이에는 외주비 잔금과 개발, 계약적인 문제가 남아 있다
280시간 일한 상황과 앞으로 100시간 이상 일해야하는 상황에서 나는 이들은 믿고 더 일을 해야할 것인가?
그리고 처음 이야기한 대로라면 별다방 다닌 사람이 시간당 받은 돈과 그리 다르지 않을 것으로 보인다.
문득 유튜브가 구글에 인수되기 몇달전에 돈이 없어 망하기 직전 유튜브 창업자가 채팅으로 내게 이런 이야기를 한 기억이 떠오른다.
어느날 자동차가 고장난 사람이 차를 고치기 위해 정비소에 차를 맡겼다. 여러 엔지니어가 차를 고치려고 했지만 다들 실패하고 자동차 회사조차 차를 살리지 못했다.
듣던 소문에 어느 시골에 전설의 정비공이 있다는 말을 듣고 차를 들고 찾아갔다고 한다.
그는 차를 휘휘 둘러보고 엔진룸에 망치를 한번 꽝하고 두드렸다.
잠시 생각 후 고개를 끄덕인 정비공은 엔진 어딘가에 느슨하게 풀러진 나사를 발견하고 나사를 쪼인 후 엔진 시동을 걸었다.
차는 거짓말처럼 시동이 걸렸다.
기분이 좋아진 차주인은 정비공에게 얼마냐고 물었다.
그러자 정비공은 천 달러라고 말했다.
"나사 한번 조이는데 천달러?"
기분이 나빠진 차주인은 정비공이 바가지라 생각해서 영수증을 달라고 했다.
정비공은 구깃구깃한 노트에 이렇게 써서 줬다고 한다.
나사를 조이는데 드는 비용 : 1달러
망치를 두드려 어디가 고장났는지 알아내는 것에 대한 비용: 999 달러.
차주인은 두말 없이 돈을 내고 차를 몰고 갔다고 한다.
왜 내가 이제 한국 일을 하지 않는지 이해가 되련지... 이해되시련지...
지금의 비극
1. 시간 당 1만원짜리 프로젝트가 될지도 모르는다는 사실.
2. 아직 계약금조차 못 받은 상황이라는 사실
3. 앞으로 100~200시간 더 일을 해야한다는 사실
4. 서비스 해킹을 막으면서 해야하지만 지금이나 앞으로 그럴 시간 조차 없다는 사실
5. 앞으로 한국 업체들이 개선되지 않을 것 같다는 것을 알고 있다는 사실.
|