튜닝을 하려면 무엇을 고려하여 기준점을 잡아야 하나

(작은 에피소드였지만 흔히 접하게 되는 일이다.)


"웹크롤러 사용해서 데이터 수집이 일주일 걸리던 것을 멀티 쓰레드로 돌려서 1일 걸립니다. 멀티 쓰레드로 바꿀 때 concurrency 문제를 해결하기 위해 O(1) 복잡도를 가진 CopyOnWriteArraySet을 사용하였습니다."

이런 뿌듯한 발표를 듣고 너무 답답했다.

물론 O(1) 복잡도도 완전히 틀린 얘기이고 (아마도 array list의 배열 색인 접근 시 연산 복잡도를 잘못 본듯) 배열을 중복 허용하지 않은 기반 자료구조로 쓰기 때문에 조금만 커져도 접근이든 삽입이든 엄청 느리겠지만 무엇보다 concurrent 자료구조이다. COW는 빈번하게 변경이 여러 쓰레드들간에 걸쳐 발생하는 상황에서는 전혀 적합하지 않다. Concurrency 문제가 개별 연산 복잡도보다 훨씬 지배적인 상황이다.

하지만 개별적인 오류는 차치하고 성능 최적화를 할 때에는 병목이 무엇이고 시스템 자원이 포화가 되는지를 기준으로 판단해야 하는데 전혀 고려되지 않는다.
네트웍 대역은 아직 널널하고 CPU 자원도 별로 일을 하지 않는데 (물론 자료구조와 concurrency logic을 잘못 선택해서 좀 많이 낭비하긴 한다) 기준 시간이었던 7일(너무 naive한 구현)이나 개선한 1일이나 큰 의미가 있을까.

Enough 라는 기준을 만족하면 되는데 하루라는 시간이 어떤 경우에 만족이 될까.

"시스템 자원을 70~80%까지 활용도를 높였는데 더 이상은 기존 로직을 세부 변경해야 해서 성능 때문에 논리 가독성을 포기하는 것은 희생이 커서 이만큼만 튜닝했어요." 이런 결론이 나야 하지 않을까.

학교마다 다르긴 하지만 많은 수도권 대학에서도 이제 운영체제와 같은 시스템 과목은 잘 가르치지도 않고 학생들이 수강하지도 않는다고 한다. 자바와 python, 웹 프로그래밍 중심의 대학 과정이 실용성의 이름으로 이루어진다.
놀랍게도 코딩만 가르쳐서 청년 실업을 해결하겠다는 움직임도 보이는데 인공지능 시대 소프트웨어의 핵심이 코딩일까? 점점 더 코드의 영역은 줄어드는데?

알고리즘 중심의 코딩 테스트가 지나치게 확산되는 것도 사실 우려스럽다. 검증된 우수 인력만 선발하는 기업과 사회 초년생을 선발하는 기업 간에 이해의 차이가 있을 순 있겠지만...
사고력, 문제 해결 능력을 검증하려면 좀더 균형 잡힌 역량을 확인하고 레디메이드가 아닌 포텐셜을 중시해야 하지 않을까.

소프트웨어 관련 학과 정원을 늘려야 한다는 주장을 언론을 통해 보곤 하는데 숫자의 문제가 맞을까.

교육 과정이 어떤 미래를 생각하고 있는지 모르겠다.
소프트웨어 관련해서는 한국이 앞선 부분이 하나도 없다는 걸 현실을 모르는 IT 선진국론에 빠져 있는 건 아닌가.

뭔가 다른 방향의 노력이 필요한 것은 아닐까.


(아래 그림은 리눅스 성능 문제를 분석할 때 사용할 수 있는 할 툴들. 해당 블로그 참조)

Linux 시스템 Performance


댓글

이 블로그의 인기 게시물

[Java] Java G1 GC의 특성에 따른 Full GC 회피 튜닝 방법

일론 머스크의 First Principle Thinking (제1원리 기반 사고)

엄밀한 사고(Critical Thinking)란 무엇일까