Tagged: Linux

리눅스 공유 메모리

리눅스 공유 메모리는 아주 특별하고 중요합니다. 튜닝하는데 있어서 매우 중요한 요소이기 때문입니다. PostgreSQL 를 세팅할때에도 반드시 해줘야 하는 것이기에 정확하게 무엇인지 짚고 넘어가고자 아는 선에 적습니다.

페이지(Page)

가장 먼저 이야기할 것이 바로 페이지(Page) 입니다. 리눅스 시스템은 메모리를 가상으로 만들어 관리합니다. 웃기게도 리눅스 시스템에서 동작하는 프로그램들은 자신들이 시스템의 모든 메모리를 사용할 수 있다, 아니 그보다 더 많은 메모리를 사용할 수 있다라고 착각을 합니다. 이는 리눅스 시스템이 메모리를 가상화해서 프로그램들에게 보여주기 때문입니다.

문제는 리눅스 시스템은 가상화된 메모리들을 페이지(Page)라는 단위로 쪼개서 관리합니다. 특정 크기를 정해서 페이지단위로 나뉘어 관리를 하는데 이렇게 해야지만이 가상화를 하기에 훨씬 쉽고 운영체제를 제작하는데 손이 덜 간다고 합니다.

그런데 이 페이지는 크기를 가지고 있으며 이를 확인하는 방법은 다음과 같습니다.

단위는 bytes 여서 정확하게 4kb 가 됩니다.

이게 무척이나 중요한 것이 PostgreSQL 데이터베이스 세스템에서 Shared_Buffer 값을 계산할때에 페이지 크기를 알아야 합니다.

공유 메모리(Shared Memory)

리눅스 시스템은 놀랍게도 공유메모리(Shared Memory)를 제공합니다. 이게 정말로 뚱딴지 같은 소리인데 왜냐하면 이 공유 메모리는 프로세스간에 서로 공유하기위해서 메모리이기 때문입니다.

프로세스는 자신만의 메모리를 필요로 합니다. 그것으로 끝입니다. 하나의 프로세스가 다른 프로세스의 메모리에 자료를 가져가면 그건 잘못된 것이고 절대로 그렇게 동작하지도 않습니다. 그런데 프로세스 사이에 자료를 공유하고 싶을때 어떻게 해야 할까요?

이럴때 바로 공유 메모리를 사용합니다. 공유 메모리의 특징은 다음과 같습니다.

  • 공유메모리는 최초로 공유 메모리를 만드는 프로세스에 의해서 만들어 집니다. 이렇게 만들어진 메모리는 커널이 관리해 줍니다.
  • 한번 만들어진 공유 메모리 공간은 직접 삭제를 하거나 리눅스 시스템이 재부팅을 하거나 해야지만 없어집니다. 모든 프로세스가 더 이상 공유 메모리를 사용하지 않는다고 자동 삭제되는 일은 결코 없습니다.

뭔가 대단히 있어보이는 듯한데, 한마디로 정의 하면

프로세스간에 데이터를 공유하고자 할때 사용하는 메모리로 커널에 의해서 관리 되어진다.

입니다. 참 쉽조잉~

그런데, 이 공유 메모리는 아주 많이 사용되어지기 때문에 이 공유메모리 양을 얼마로 해주냐가 리눅스 튜닝의 시작입니다. 실제로 커널 파라메터에 다음과 같은게 있습니다.

많이들 하는 튜닝입니다. 최대 공유 메모리를 얼마나 할 것인가 하는 겁니다.

공유 메모리는 최소(SHMMNI), 최대(SHMAX), 그리고 시스템을 통틀어 모든 공유 메모리 세그먼트의 총합(SHMALL) 로 구분이 되는데 이들의 최대 용량(제한 용량)은 다음과 같이 확인할 수 있습니다.

그런데, 여기서 주의해야 할 것이 있습니다. 커널은 이값을 지정할때에 shmmax 는 ‘bytes’ 단위이고 shmall 은 ‘pages’ 단위 입니다.

위에 보시면 커널에 할당된 shmall 값과 ‘ipcs -lm’ 해서 나온 값이 다릅니다. 이는 단위의 차이로 인한 것으로 커널의 shmall 값은 page 단위이기 때문에 다음과 같이 계산하면 ‘ipcs -lm’가 똑같아 집니다.

SHMMAX 값은 새로운 메모리 영역을 할당할때, 그러니까 shmget() 함수를 호출할때에  사용가능한 최대 메모리 양을 말합니다. 다시 강조하면 shmget()함수를 이용할때입니다. 이는 단일 프로세스가 공유메모리를 호출하기 위한 최대 값이라는 이야기 입니다.

SHMALL 은 시스템을 통틀어 모든 프로세스가 사용 가능한 공유메모리 양입니다.

이게 왜 중요해?

대부분 데이터베이스 시스템을 다룰때에 이 부분이 문제가 됩니다. ORACLE, PosgreSQL의 경우에 바로 이 공유 메모리 설정이 작으면 설치가 진행이 안된다거나 서버가 구동된다하더라도 오류 메시를 내보내고 오류를 내는 경우가 많습니다.

어떻게 설정해야 잘 하는 것일까? 혹은 적절한 값은 무엇인가는 어떤 시스템을 다루느냐에 따라서 달라집니다. PostgreSQL 의 경우에 Shared_buffers 값이 있는데, 이 값은 PostgreSQL에서 데이터를 캐쉬하는데 얼마의 RAM을 사용할 것인지를 지정합니다. PostgreSQL의 경우에 Subprocess 모델 기반으로 각 프로세스별 데이터를 공유하기위해서는 바로 공유메모리가 필요하고 Shared_buffers 는 결국 공유 메모리 입니다. 따라서 운영체제에서 PostgreSQL이 요구하는 Shared_buffers 메모리 값보다 적은 공유 메모리를 설정하면 PostgreSQL이 동작하지 않습니다.

PostgreSQL 의 경우에 Shared_buffers 메모리는 32GB 경우에 8GB 를 Shared_buffers 로 권장하고 있습니다. Shared_buffers 메모리는 공유메모리이고 단일 프로그램이 사용할 것이 때문에 SHMMAX 는 최소 8GB로 해야 합니다.

최대 공유메모리는 32GB-4GB 정도해서 28GB를 SHMALL로 지정해줍니다. 정리를하면

위와같이 지정할 수 있겠습니다.

공유 메모리 사용현황

공유메모리 사용현황은 ‘ipcs -a’ 명령어를 이용해서 확인할 수 있습니다.

Phoronix 벤치마크 하기

이 글은 Phoronix 벤치마크 하기 에 대한 글  입니다.

Phoronix 는 리눅스  벤치마크 테스트 툴 입니다. 이툴은 하드웨어 벤치마크와 소프트웨어 벤치마크를 모두 지원 합니다. 하드웨어 벤치마크는 새로운 사양의 서버가 들어왔을때에 CPU, RAM 대역폭, DISK I/O 성능들을 측정을 말하며 소프트웨어 벤치마크는 GCC 컴파일러, Kernel 성능들을 측정하는 것일 말합니다.

Phoronix 의 성능측정 결과는 HTML 파일로 저장이 되며 https://openbenchmarking.org 자동으로 포스팅하는 기능이 있어 여러사람과 결과를 공유할 수 있습니다.

Installation

설치환경은 CentOS 6 입니다. CentOS 의 경우에 Epel Yum 저장소를 추가하면 다음과 같이 Phoronix 가 설치가 가능합니다.

Phoronix 사용법

Phoronix 는 벤치마크를 위한 것을 모듈로 만들어 놓고 필요한 벤치마크를 하고 싶다면 필요한 모듈을 설치하면 됩니다. 어떤 벤치마크 모듈이 있는지 확인하고 싶다면 다음과 같이 합니다.

리스트를 보면 모듈파일명, 모듈명, 영역으로 나뉘어 보여줍니다. 영역은 이 벤치마크가 무엇을 대상으로 하는지를 알려줍니다.

벤치마크 모듈은 다음과 같이 설치합니다.

벤치마크를 할때는 하고자하는 벤치마크 모듈들을 연달아 적으면 됩니다.

CPU 벤치마크

CPU 벤치마크를 위해서 다음의 모듈들을 설치해 줍니다.

그리고 다음과 같이 벤치마크를 돌립니다. 결과는 화면으로도 뿌려지지만 html 로도 저장이 됩니다.

마지막에 이와같이 OpenBenchmarking.org 사이트에 올릴거냐고 물어봅니다. 테스트결과는 /var/lib/phoronix-test-suite/test-results 에 저장이 됩니다.

Memory 벤치마크

필요한 모듈은 위와같이 하면 되고 테스트도 앞서 CPU 때와 비슷하게 모듈을 가지고 실행하시면 됩니다.

Disk I/O 벤치마크

벤치마크 결과

powerline vim 플러그인 설치

vim 를 사용하다보면 상태바에 많은 정보를 표시해주면 좋습니다. 이를 위해서 .vimrc 에다가 많은 설정을 사용해서 사용하지만 이것을 아예 Plugin으로 할 수 있도록 제공해주고 있습니다.

Vundle 설치

vim 플로그인을 쉽게 설치하고 제거하기를 도와주는 플로그인 매니저중에 Vundle 를 사용하겠습니다. 설치는 다음과 같이 해줍니다.

설치는 이와같이 Vundle.vim 파일을 넣어주면 끝납니다.

.vimrc 파일 수정

인터넷을 보면 다양하게 .vimrc 파일이 있습니다. 이 파일에는 어떤 플러그인을 할지도 정의되어 있습니다.

위의 내용에 필요한 것들을 하나씩 설치해야 합니다.

vim Plugin 설치하기

이제 필요한 것들은 모두 되었습니다. 다음과 같이 vim 에 plugin 을 설치합니다.

이렇게하면 vim 창이 수직으로 분할되면서 Plugin이 설치됩니다.

solarized.vim 테마 설치

이 테마는 다음의 주소에서 다운로드 받을 수 있습니다.

설치는 다음과 같이 해줍니다.

Python 코딩 스타일 자동 체크 및 수정하기

이것은 Syntastic vim 플러그인을 위한 것입니다. python 문법체크는 pyflake, pep8 등이 있는데, 이를 위해서 python 모듈을 설치해줘야 합니다.

링크: vim에서 python 으로 자동문법&수정하기

그리고 다음의 파일을 다운받아 ~/.vim 디렉토리 아래에 압축 해제합니다.

파일: Autopep8 and salt syntax checker
vim syntaxchecker for python
코딩 스타일이나 문법이 맞지 않은 파일을 열거나 저장할려고 하면 위 화면과 같이 화면이 수평분할되면서 문제를 지적해줍니다. vim 의 command mode 에서 ‘:Autopep8’ 를 입력하고 엔터를 치면 자동으로 수정을 해줍니다. 물론 문법 오류의 경우에는 수정을 해주는 경우도 있지만 안되는 경우도 있습니다만 코딩 스타일의 경우에는 대부분 자동으로 수정이 됩니다.

Ubuntu 에 zsh 설정하기

zsh 을 이용하면 다양한 테마를 사용할 수 있고 이 테마들은 각 작업때마다 터미널에 관련 작업 상태들을 표시해주어 편리합니다. 예를들어 git 를 사용하시는 분들은 zsh 를 설치하고 테마를 설정해주면 터미널에 git 관련 상태들이 프롬프트에 표시되어 편리합니다.

이 문서는 Ubuntu 에 zsh 설정하기 에 관한 글 입니다.

zsh 설치

Ubuntu 의 경우 zsh 설치는 아주 쉽습니다. apt-get 을 이용해서 설치합니다.

테마 설치 및 설정

테마는 각 계정당 해줍니다. 사용할 계정에 설정을 해주시면 됩니다.

마지막에 기본쉘을 바꾸기위해서 사용자 계정의 패스워드를 물어보고 입력을 해주면 기본쉘이 zsh 로 바뀝니다.

이제 git 프롬프트를 위해 테마설정 작업을 해줍니다. 설치할때 Oh-My-Zsh 를 이용했기 때문에 이를 위한 테마를 설치해줍니다.

이제 로그아웃 했다가 로그인을 하면 프롬프트가 바뀌어 있고 git 디렉토리에 들어가면 프롬프트에 git 상태가 표시가 됩니다.

프롬프트에는 glyphs 를 표시해주기도 하는데, 이를 위해서는  powerline font patch 를 해줘야 합니다.

마지막으로 power line patched font 를 설치해줍니다.

관련 링크

AWS Kinesis

이 글은 AWS Kinesis 이 무엇인지에 대한 개념적인 글입니다.

다음의 자료를 기반으로 작성되었습니다.

  1. Introducing Amazon Kinesis (SlideShare)
  2. Introduction to Amazon Kinesis (Youtude)

Big Data

인터넷의 발전으로 인해서 하루에도 계산하기 힘든 데이터가 쏟아집니다. 과거와는 달라진 이러한 환경을 우리는 간단히 Big Data 시대라고 하지요. 어찌보면 과거에도 Big Data 는 있었지만 요즘과 구별되는 것은 누구든지 Data 를 생산할 수 있다는데에 있습니다. 그러다보니  과거와는 다르게 쏟아지는 데이터를 분석해서 유의미한 데이터를 뽑아내는 기술이 필요하게 되었는데 이게 바로 Big Data 의 진정한 의미 중에 하나 입니다.

누구나 생산해내는 데이터들을 유의미한 의미의 정보로 가공해내는 것이 바로 Big Data 기술이라고 할 수 있습니다.

Batch VS Streaming

과거 이야기를 좀 더 해보면, 과거에도 데이터를 분석해내는 방법이 있었습니다. 첫번째로는 데이터를 모우는 겁니다. 그리고 그것을 특정한 저장소에 저장을 합니다. 대부분 데이터베이스시스템에 저장을 했습니다. 그리고 그것을 이용해서 쿼리문을 이용해서 데이터를 뽑아 냈습니다.

그런데, 데이터를 모으고 데이터베이스에 저장하고 하는 부분은 특정 시간에 서버에 작업을 걸어놓아하는 경우가 많았습니다. 간단하게는 리눅스 시스템에서 크론(Cron) 을 이용해서 특정 배치 프로그램을 돌려서 데이터를 모우고 데이터베이스에 집어넣는 방법을 이용했지요.

하지만 Big Data 시대에 이 방법이 과연 유용한가 하는 문제가 있습니다. 몇분, 몇시간, 몇일간격으로만 배치작업을 돌리는건 쏟아지는 데이터 속도보다 빠르지 못하다보니 데이터분석을 할 수 없는 경우가 많습니다. 설사 분석을 해낸다고 해도 이미 시간이 많은 흐른뒤라서 시의성을 가지지 못하는 정보가 될 겁니다.

그래서 등장한 것이 스트리밍(Streaming) 입니다. 스트리밍, 물 흐르듯 그때그때 데이터를 분석해내면 유용한 정보를 얻기위해서 기달릴 필요가 없을 겁니다. 그때 그때 분석한 데이터를 데이터베이스에 저장하거나 파일로 저장하는것도 가능합니다.

그래서 현대의 Big Data 분석 소프트웨어들은 전부다 Streaming 을 지원하도록 발전되어 왔습니다.

현대의 BigData 구조
현대의 BigData 구조

많은 소프트웨어들이 이렇게 데이터 수집, 분석처리, 저장, 분석 및 리포트 영력으로 나뉘어 발전되어지고 있습니다.

위 그림에서 문제가 하나 있습니다. 데이터 수집 부분과 데이터 처리부분 입니다. 이 부분이 문제가 되는 이유는 데이터 수집하는 소프트웨어와 처리하는 소프트웨어간의 데이터 교환을 맞춰줘야 하고 둘이 동기화 되어 처리되어야 합니다. 어느 한쪽이 병목이 생기면 문제가 생길 수도 있습니다.

AWS Kinesis

AWS Kinesis 는 데이터 수집구간과 데이터 처리구간 중간에 위치합니다. 이렇게 중간에 위치하는 소프트웨어를 만든 이유는 다양한 데이터들을 수집하고 이것을 다양한 포맷으로 만들어 줍니다.

Kinesis 를 이해하는데 헷깔리는게 있는데, Kinesis 가 ‘스트리밍 데이터 처리’ 를 해준다는 것입니다. 여기서 스트리밍 데이터 처리라는 말은 스트리밍으로 데이터를 분석해준다는 이야기가 아닙니다.

다양한 형태로 들어오는 데이터를 가공해서 다양한 분석 소프트웨어가 사용가능하도록 다양한 출력물을 만들어내주거나 데이터 저장소에 저장하도록 해줍니다.

기본의 Streaming 처리
기본의 Streaming 처리

기존의 Streaming 처리구조 입니다. 수많은 다양한 데이터들이 들어오고 이것을 처리하는 가공하고 분석하는 도구들이 붙어 있습니다.

AWS Kinesis
AWS Kinesis

AWS Kinesis 는 다양한 데이터들을 빠르게 가공해줍니다. 그리고 이러한 데이터들은 다양한 포맷으로 출력줌으로써 다양한 소프트웨어서 사용해주게 해줍니다.

다어그램으로 표현하면 다음과 같습니다.

AWS Architecture
AWS Architecture

AWS Kinesis 는 다양한 입력 데이터와 출력을 해줍니다.

AWS Kinesis Sending & Reading Data from Kinesis Streams
AWS Kinesis Sending & Reading Data from Kinesis Streams

Amazon 에서는 Kinesis 를 다음과 같이 설명하고 있습니다.

Amazon Kinesis는 완전관리형 스트리밍 데이터 서비스입니다. 수십만 개의 소스에서 클릭 스트림, 애플리케이션 로그, 소셜 미디어와 같은 다양한 유형의 데이터를 Amazon Kinesis 스트림에 지속적으로 추가할 수 있습니다. 그러면 몇 초 안에 Amazon Kinesis 애플리케이션에서는 스트림의 해당 데이터를 읽고 처리할 수 있습니다.

“Amazon Kinesis 스트림에 지속적으로 추가할 수 있습니다” 이 말의 의미를 잘 생각해본다면 이것이 무엇인지 감을 잡을 수 있을 겁니다.

SaltStack 시작하기.

이 글은 SaltStack 시작하기 에 관한 글입니다.

SaltStack 은 자동화 시스템 관리 프로그램입니다. 서버의 설정파일, 패키지 관리, 시스템 명령어등을 한번에 많은 서버에 할 수 있습니다. Chef, Puppet 등과 동일합니다. 단지 이 녀석은 Python 으로 개발이 되었고 역활을 지시하는 sls 파일 문법이 YAML 이며 Jina Template 을 이용해서 sls 에 프로그래밍을 할 수 있습니다.

SaltStack 은 서버와 클라이언트로 모델입니다. 서버역활을 담당하는 SaltStack 을 마스터(Master)라고 하고 클라이언트 역활을 담당하는 SaltStack 을 하녀(Minion)이라고 부릅니다. 마스터의 경우 파일 전송을 할 수 있게 파일서버역활도 같이 합니다.

마스터, 하녀 역활로 나뉘어 있기 때문에 당연히 하녀가 어느 SaltStack 마스터에 지시를 받을것이지 하는 등록절차가 필요합니다.

Master 설치

설치 환경은 CentOS 를 기준으로 합니다. CentOS 의 경우에 Base Repository 에 SaltStack 패키지가 없습니다. 하지만 Epel Repository 를 설치하면 간편하게 Yum 명령어로 설치할 수 있습니다.

대략 20여개의 의존성 패키지들과 함께 설치됩니다. 앞에서 말했듯이 Salt 는 Python 으로 제작되었기 때문에 Python 관련 패키지가 많이 필요합니다.

Salt 마스터 설정.

설정파일은 /etc/salt/master 입니다. 아주 많은 옵션들이 존재하고 각 옵션마다 자세한 코멘트가 있어 어렵지 않게 필요한 것들을 설정할 수 있습니다.

기본적인 설정은 대략 다음과 같습니다.

위 설정만으로도 Salt 마스터는 잘 동작합니다.

Salt minion 설치하기

역시 CentOS 환경이고 Epel Repository 를 추가해서 Yum 을 이용해서 설치하면 됩니다.

설치가 완료되면 /etc/salt/minion 파일에 설정을 하면 됩니다.

Salt minion 설정.

설정파일 /etc/salt/minion 을 열어서 다음과 같이 기본적인 설정을 해줍니다.

id 설정이 중요합니다.

/etc/hosts 파일 설정.

리눅스의 hosts 파일을 마스터와 Minion 양쪽 모두에 설정해 줍니다.

Salt Minion 을 마스터에 등록하기

Salt 마스터는 Minion 을 등록해서 그 리스트를 유지하고 있습니다. Minion 이 마스터에 등록되어 있지 않다면 마스터로부터 그 어떠한 작업 지시를 받을 수 없겠죠. 그래서 새로운 Minion 이 생긴다면 먼저 마스터에 등록을 해줘야 합니다.

등록은 마스터에서 다음과 같이 합니다.

마스터와 minion 간에 통신이 된다면 위와같이 “Unaccepted Keys” 에  아직 등록하지 않은 minion 이 나옵니다.

등록은 다음과 같이 합니다.

등록이 되었다면 minion 과 통신이 잘되는지 다음과 같이 확인해 봅니다.

위와같이 나오면 정상입니다.

서로 다른 RabbitMQ 버전으로 Cluster 구성 테스트.

RabbitMQ 는 인기있는 메시지 브로커 입니다. 비동기 메시지를 다루는데 있어서 RabbitMQ 는 많이 사용되어 집니다. 거기다 RabbitMQ 는 여러 RabbitMQ 를 하나로 묶는 Cluster 기능을 제공합니다. 그런데, 언제나 그렇지만, 서로다른 RabbitMQ 버전끼리 하나로 묶을 수 있을까하는 의문이 들었습니다. 테스트를 해보았습니다.

환경 세팅

master, slave 라 불리는 2개의 서버를 준비했고 각각 3.5.4 버전과 3.1.5 버전을 설치했습니다. 모든 버전은 Epel 저장소에서 RPM으로 설치를 했습니다.

그리고 다음과 같이 RabbitMQ 를 설정했습니다.

  1. master 의 쿠키 파일를(/var/lib/rabbitmq/.erlang.cookie) slave에 복사했습니다.
  2. 양쪽모두 호스트네임을 /etc/rabbitmq/rabbitmq-env.conf 에 지정해줬습니다.

결과

결과적으로 RabbitMQ 는 서로다른 버전으로 Cluster 를 구성할 수 없습니다.

버전이 맞지 않는다고 에러를 냅니다.

혹시나 Master 버전이 Slave 버전보다 낮아서 그런가 싶어서 거꾸로 해봤습니다. (Slave 버전이 Master 버전보다 높습니다.) 즉, 버전이 낮은 RabbitMQ Node 를 높은 버전의 RabbitMQ Node 로 묶어보자는 거였는데 그것도 안됐습니다.

이 메시지는 아마도 데이터베이스 스키마가 달라졌기 때문에 안되다는 오류 메시지로 보입니다.

RabbitMQ 통계 보기.

RabbitMQ 는 AMQP 를 지원하는 Message Queue 프로그램 입니다. 여러 솔루션에서 함께 쓰이고 있는 매우 인기있는 프로그램입니다.

언제나 그렇지만 RabbitMQ 또한 각종 통계자료를 제공 합니다. 이를 통해서 RabbitMQ 건강상태를 체크할 수 있습니다. 이 문서는 이에 대해 간략히 다룹니다.

RabbitMQ Statistics
RabbitMQ Statistics

통계정보를 보는 방법으로는 CLI 를 통해서 볼 수도 있지만, 웹을 통해서 GUI 환경에서 쉽게 볼수 있습니다. 이를 위해서는 GUI Management Plugin 을 활성화해줘야 합니다.

이렇게 하면 웹브라우저를 통해서 RabbitMQ 를 관리할 수 있으며, 간략한 통계정보를 볼 수 있습니다. 이 통계정보를 이해하기 위해서는 Message Broker 에 대한 짧막한 지식이 필요합니다.

Global Counts

전역적인 통계자료 입니다.

Connections

Message Broker 에 TCP 접속을 한 개수 입니다. 그냥 간단하게 RabbitMQ 에 접속한 개수를 말합니다.

Channels

RabbitMQ 는 Channel 이라는 개념을 사용합니다. Connection 내에 존재하는 것으로 가상 커넥션이라고 불리기도 합니다. 이것은 애플리케이션이 다중의 접속을 요구하는 경우에 하나의 TCP Connection 으로 접속을  Multiplex 해주어 접속량을 획기적으로 줄여줍니다.

따라서 하나의 TCP Connection 에 여러개의 접속이 이루어질 수 있어 이 수치는 Connections 개수보다 많이 나올 수 있습니다.

Exchanges

이것은 단일 생산자-소비자 구조에서 생산자-다중 소비자 구조시에 중간에 생산자의 메시지를 분배해주는 역활하는 Exchanges 개수를 말합니다. Publish/Subcribe 패턴에서 나옵니다.

Publish/Subscribe Pattern
Publish/Subscribe Pattern

Queues

메시지 큐의 개수를 말합니다.

Consumers

큐에서 메시지를 꺼내서 쓰는 소비자의 개수를 말합니다.

Nodes 

RabbiMQ 는 Cluster 구조로 여러 서버들을 붙일 수 있습니다. 그렇게되면 Nodes 에 그 서버들이 나타나고 상태정보도 보입니다.

File Descriptors

프로세스에 의해서 오픈한 File Descriptor 개수 입니다. 아래에는 최대 활용가능한 개수도 나옵니다. 만일 이것이 비율로 90%가 넘는다면 문제가 생길 수 있어 이를 잘 모니터링 해야 합니다. 또, 운영체제의 최대 파일 오픈 개수에 영향을 받습니다.

Socket Descriptor

프로세스에 의해서 오픈한 Socket Descriptor 개수 입니다. 아래에는 최대 활용가능한 개수도 나옵니다. 만일 이것이 비율로 90%가 넘는다면 문제가 생길 수 있어 이를 잘 모니터링해야 합니다.

Erlang Processes

Erlang 프로세스들의 개수 입니다. 아래에는 최대 활용가능한 개수도 나옵니다. 만일 이것이 비율로 90%가 넘는다면 문제가 생길 수 있어 이를 잘 모니터링해야 합니다.

Memory

RabbiMQ 서버에서 사용하고 있는 메모리양 입니다.

git 파일 삭제후 복구.

git 를 사용하다 보면 local 저장소에서 실수로 파일을 삭제하는 실수를 저지를 수 있다. 이때 파일을 되살린다고 ‘git pull’ 이나 ‘git fetch’를 해봐도 나오는 메시지는 최신판(Already up-to-date)라는 것이다.

이를 이용하는 경우에 어떻게 해야하나?

먼저 삭제한 디렉토리로 이동한다. 그리고 다음과 같이 입력을하면 삭제한 파일 목록을 얻을 수 있다.

사실 삭제된 파일은 다시 checkout 받으면 된다. 다음과 같이 말이다.

리눅스를 잘 다루는 사람이라면 이것을 한번에 할수 있다.

 

 

 

Better VACCUM FULL For PostgreSQL 9.0

원문:https://wiki.postgresql.org/wiki/What’s_new_in_PostgreSQL_9.0#Better_VACUUM_FULL

지금까지 VACUUM FULL 은 매우 느렸다. 이 구문(Statement)는 테이블로부터 빈공간을 확보하고 그것의 크기(Size)를 줄였지만 VACUUM 은 만족할만큼 빠르게 동작하지 않았다.

이것이 느린 이유는 동작 방법에 문제가 있었기 때문이다. 레코드를 그들의 소스블럭으로부터 테이블에 시작점에 가까운 블럭으로 하나하나씩 읽어서 옮겼었다. 그리고 테이블에 끝이 빈공간이면 그 부분을 지웠다.

전략적으로 이러한 방법은 매우 비효율적(Inefficient) 이다. 레코드를 하나하나씩 옮기는 것은 랜덤 I/O를 발생시킨다. 게다가, 인덱스(Index)를 재구성하는 동안에 그것을 유지하고, 더 많은 비용이 들어가는, 인덱스는 파편화된다. 이럴바에는 VACUUM FULL이 다 끝나고 나서 재인덱스(reindex)를 하는 것이 낫다.

Version 9.0 에서 VACUUM FULL은 테이블과 동일한 또 하나의 테이블을 만들고 거거에 모든 레코드를 순차적이게 복사한다. 모든 레코드가 복사되고 나면, 인덱스를 재생성하고 예전 테이블은 삭제되고 새로운 테이블로 대체된다.

이것은 VACUUM 을 보다 빠르게 한다. 하지만 VACUUM FULL은 동작하는 동안에 AccessExclusiveLock 을 필요로 한다. 이전 방법과 비교했을때 이 방법의 결점은 VACUUM FULL을 했을 경우 새로운 버전의 테이블을 만들기 위해서 디스크에 테이블 크기의 2배의 용량을 사용할 수 있다는 것이다.

이제, 두가지 방법에 대해서 실시간으로 비교를 해보자. 먼저 아래와 같은 방법으로 테스트 데이터를 준비 했다.

8.4 버전에서는.

다 합해 대충 9초 정도 걸렸다.

9.0 버전에서는.

아직 이것은 제품에서(아마 서비스중에라는 뜻인듯..) VACUUM FULL 이 좋은 아이디어라는 뜻은 아니다. 만약 이것이 필요하다면, 아마도 VACUUM 정책이 올바르지 않기 때문일 것이다. (응?)