본문 바로가기
🟢 Graph

콜로니 그래프(Colony Graph): 클라우드 서비스를 시각화하기 - 02

by 제리강 2024. 3. 11.

2024.03.10 - [🟢 Graph] - 콜로니 그래프(Colony Graph): 클라우드 서비스를 시각화하기 - 01

 

TL; DR

이전 포스트의 클라우드 시각화에서는, 클라우드 환경 전반에서 프로세스와 그 parent-child 계층 구조를 보여주며 다양한 규모에서 패턴을 탐색했다.
본 포스트에서는, 좀 더 나아가 시간 경과에 따른 프로세스의 변화 양상을 살펴본다. 이러한 변화 양상의 일부 순간을 포착하여 그래프로 표현하는 것을 원저자는 프로세스 스냅샷(process snapshot)이라 언급하고 있다.

 

 

원문 링크: https://www.brendangregg.com/ColonyGraphs/snapshots.html

 

 

살아있는 듯한 프로세스 스냅샷

 

 

마치 심장 박동이나 미세한 생명체처럼 보여 기괴해보일 수도 있는 이 애니메이션은 60초 간격으로 촬영된 프레임(프로세스 스냅샷)으로, 바쁜 Apache 웹 서버를 보여주고 있다. 위 애니메이션은 20분 길이의 프로세스를 나타내며, 2초 간격으로 반복되어 타임랩스 사진과 유사한 효과를 만들어낸다*.

 

*1분마다 촬영한 20장의 프로세스 스냅샷을 이용해, 2초 길이의(초당 10프레임) 애니메이션을 구축한 것으로 보인다. 

 

프로세스의 크기는 최근 CPU 사용량에 따라 달라지는데 클수록 더 바쁘다는 의미이며, 색상은 노드 명에 해당하는 프로세스 유형을 나타낸다. 유형을 지정하지 않은 프로세스 이름은 기본적으로 검은색 테두리가 있는 회색으로 표시된다. 프로세스는 최근 CPU 사용량이 달라짐에 따라 커지거나 줄어드는데, 이는 Apache가 작업의 균형을 균등하게 맞추고 있음을 나타낸다.

 

 

 

어플리케이션 서버

위 애니메이션은 시각적으로는 흥미롭지만 다소 극단적인 형태이며, 대부분의 서버는 아래와 같은 모습에 더 가깝다.

 

 

클라우드 환경에서는 단일 OS 인스턴스가 단일 어플리케이션(이 경우 웹 서버)을 실행하는 것이 일반적이다. 매분 스냅샷을 찍어 확인해보았을 때, 시간이 지나도 큰 변화는 보이지 않는다.

 

 

 

멀티 애플리케이션 서버

다음은 여러 개의 어플리케이션을 실행하는 OS 인스턴스이다.

 

 

이 스냅샷에는 웹 서버와 메일 서버가 포함된다. 여기서는 작업을 전송하고 종료하기 위해 프로세스가 생성되기 때문에, 훨씬 더 바쁘다. 여기에는 Apache 모듈로 mod_php를 사용하는 대신,  더 높은 비용을 가지면서 PHP를 사용하는 php5-cgi 프로세스가 포함된다.

 



이 애니메이션의 문제점은, 세부 사항을 식별하는 데 기억력과 인내심이 필요하다는 것이다. 특히 한 프레임에서는 애니메이션의 왼쪽 하단에 수명이 짧은 프로세스가 나타나는데, 이는 imapd에 의해 실행된다.오른쪽에는 bash 프로세스가 sort와 awk이라는 두 개의 grep을 실행하는 전형적인 셸(shell) 스크립트 명령을 보여준다.  서버의 성능을 조사하거나 이상 동작을 해결할 때, 이와 같이 수명이 짧은 프로세스를 알아두는 것이 중요할 수 있다.

 

 

 

시간 흐름을 투명성으로 표현하기(Time as Transparency)

시간대별로 생성된 프레임 이미지를 병합하면, 모든 프로세스를 한 번에 볼 수 있다.

 

 

 

첫 번째 프레임은 이전과 같이 표시되며, 이후 프레임 프로세스는 투명한 색상과 점선으로 추가된다. 이렇게 하면, 원래 레이아웃은 불투명한 색상으로 표시되고 다른 시간대 영역의 추가 정보는 투명한 요소로 표시된다. 프로세스 이름을 더 잘 구분하기 위해, 각 화살표의 길이를 조금 더 늘렸다.

이 이미지에는 1분 간격의 45개의 프로세스 스냅샷이 포함되어 있다(애니메이션에는 이 중 20개의 스냅샷만 포함됨). 생성된 이미지의 밀도와 패턴은 프로세스의 활동 및 포함된 스냅샷 수와 관련이 있습니다. 이 이미지에서 웹 서버 재시작 프로세스를 관찰한다고 생각해보자. 이 경우 두 개의 httpd 프로세스 클라우드를 볼 수 있는데, 두 번째 클라우드는 투명한 마스터에서 시작된다.

투명도를 사용하면 겹치는 프로세스를 통해 프로세스 이름을 볼 수 있으므로 프로세스가 밀집된 영역에서 더 자세한 정보를 볼 수 있다. 또한 이러한 중첩은 노드의 색 채도를 높여 밀집도에 대한 또 다른 시각적 단서를 제공한다.

 

 

 

장노출(Long Exposure)

투명화를 이용한 또 다른 접근 방식은, 모든 프레임에 존재했던 프로세스에 대해서는 불투명한 색상을 표시하고 일부 세트에 있었던 프로세스에 대해서는 투명한 색상을 표시하는 것이다. 투명도에는 해당 프로세스가 포함된 프레임 수에 따라 가중치가 부여된다. 프레임 수가 적을수록 투명도가 높고, 데이터 추출 기간 동안 프로세스가 실행된 시간이 적다는 것을 의미한다.

 

 

 

이렇게 하면 장노출 사진과 유사한 효과를 얻을 수 있다. 하나의 프레임만 사용할 땐, 프로세스 노드 크기를 단일 시간대 데이터 기준으로 정하지만, 이 예제에서 프로세스 노드 크기는 모든 샘플의 평균 CPU 사용량을 반영하여 표현한다.

 

 

일반적인 예시

병합된 프로세스 시각화가 모두 위와 같이 아름답지는 않다. 다음 이미지는, 단일 애플리케이션 서버에 다른 시간대 정보를 투명 요소로 추가한 것을 나타낸 이미지이다.

 

 

같은 프로세스에 대한 장노출 이미지는 다음과 같다.

 

 

 

두 이미지를 통해, 유형 간의 차이점을 비교할 수 있다. 시간 흐름을 투명화로 표현하는 방법의 장점은, 전체 프로세스 스냅샷을 불투명하게 볼 수 있어 투명한 시간 영역을 고려하기 전에 연구하고 이해할 수 있다는 것이다.

 

예를 들어, 첫 번째 스냅샷에서는 마스터(master) 프로세스에서 pickup 프로세스 하나만 실행되고 있음을 볼 수 있다. 장노출 방법에서는 프로세스 트리를 이해하는 것이 이보다는 덜 명확하다. 색 채도를 기준으로 수명이 짧은 프로세스가 얼마나 오래 실행되었는지는 더 잘 알 수 있지만, 단일 스냅샷이 어떻게 구성되었는지는 명확하지 않다. 예로, 마스터 프로세스가 두 개의 pickup 프로세스를 절반의 시간 동안은 실행했을 수도 있고, 나머지 절반의 시간은 실행하지 않았을 수도 있다.

 

 

서버

다음은 이러한 시각화를 확장하는 다른 예로, 여러 개의 소규모 OS 가상화 인스턴스(대부분은 웹 서버인)를 실행하는 물리적 서버 전체를 나타낸다.

 

 

여기서는 투명성 방법을 사용했다. 이 스냅샷은, cron에서 시작된 수명이 짧은 몇 가지 프로세스를 포착했다.

 

 

 

프로세스 스냅샷의 한계

60초마다 또는 심지어 1초마다 프로세스 스냅샷을 찍으면, 수명이 짧은 많은 프로세스를 놓칠 수 있다. 프로세스는 10밀리초(ms) 이내에 실행되고 완료되기도 하며, 특히 작은 프로세스 기반 명령에 기반한 셸 스크립팅의 경우 더욱 그렇다.

프로세스 스냅샷은 무엇이 실행되고 있는지에 대한 대략적인 인사이트만 제공한다. 프로세스 스냅샷을 찍는 모든 도구는 이 문제를 겪겪는다. 스냅샷을 더 자주 찍으면 /proc를 자주 읽음으로써 수집 과정의 오버헤드가 증가한다. 이 문제는 여러 테넌트(multiple tenants)의 프로세스를 포함하므로 /proc가 평소보다 큰 OS 가상화 클라우드 환경에서 더 두드러질 수 있습니다.

 

* 멀티 테넌시(multi tenancy) 라는, 하나의 인스턴스의 소프트웨어가 여러 사용자 그룹(테넌트, tenants)을 서비스할 수 있도록 하는 아키텍처에서 사용되는 용어

 

 

 

구현

여기서는, 프로세스 스냅샷을 세 가지 실험적인 방법인 타임랩스 애니메이션, 시간을 투명 요소로 추가한 이미지, 장노출 이미지로 시각화했다. 시각화되는 데이터는 기본적으로 프로세스 스냅샷('ps -eo zone,ppid,pid,pcpu,comm' 명령어를 이용한) 데이터이다.

위의 이미지는 그래프 시각화를 사용하여 생성된 것으로, ps 출력을 깔끔한 그래프로 변환하는 데에는 약간의 어려움이 있었다. 가장 까다로운 부분은 애니메이션을 만드는 것이었는데, 그래프 시각화를 할 때 각 프레임마다 완전히 다른 레이아웃이 적용되어 전체 장면을 90도 이상 회전하는 경우가 많았다. 이를 해결한 방법은 모든 프레임에 존재하는 요소들을 모든 프레임에 각각 렌더링하고 각 프레임에 존재하지 않는 요소에 'invis(보이지 않는)' 스타일을 적용하는 것이었다. 

 

클라우드 환경에서는 OS 가상화를 사용하여 클라우드 인스턴스를 실행하기 때문에, 이러한 시각화를 쉽게 구현할 수 있었다. OS 가상화로 인해 각 물리적 서버의 글로벌 영역에서 ps가 에이전트에 연결하여 정보를 확인할 필요 없이, 모든 OS 인스턴스의 세부 정보를 직접 검사할 수 있었다. 전체 클라우드를 시각화하려면, 단지 물리적 서버에만 연결하면 되었다.

 

 

마치며

이 포스트에서는 프로세스를 단일 프레임에서 분석하는 것에서 나아가 시간에 흐름에 따라 분석했는데, 이 때 시간 정보를 투명성을 활용해 표현했다. 
이를 통해 시간 정보를 포함한 분석 인사이트를 얻었지만, 모든 프로세스 변화 정보를 포착하기는 어려운 한계도 존재한다.

원 포스트에서는 프로세스 실행에 대한 다른 분석도 있지만, 다소 전문적이어서 참고만 해도 좋다.
클라우드를 프로세스 중심으로 시각화할 수 있다는 관점과, 시각화를 수행한 방법을 기억해두면 추후 유용할 것으로 보인다.

 

댓글