2010/11/13

Modern Perl 책 무료로 공개



Perl커뮤니티에서 chromatic이란 닉네임으로 활동하고 있는 분이 얼마 전 Modern Perl이란 책을 내놓았다.

Modern Perl이라 함은 여러버젼을 거쳐서 발전해온 Perl 5의 기능과 장점을 살려 어떻게 현대적 스타일로 Perl 프로그램을 작성할 것인가를 다룬다.

PHP가 웹프로그래밍언어로 인기를 끌기 전 한때 유행했던 Perl CGI시절 Perl에 대한 기억을 가지고 있는 사람들은 이 책을 본다면 새로운 Perl의 모습을 볼 수 있을 것이다. ( 본인도 예전에 Perl CGI가 유행하던 시절 한가닥했던 국내에서 개발된 Perl CGI기반 게시판 소스들을 받아서 본 적이 있는데 현대적 Perl프로그래밍 스타일에 비하면 거의 스파게티 혹은 쓰레기 코드 수준이어서 실망했던 기억이 있는데 그 시절 Perl은 Perl 5가 아닌 Perl 4혹은 Perl 3스타일 이었다고 할 수 있다.)


참고:
Modern Perl 무료책
Modern Perl Blog 

그리고 추가하여 더이상 구시대의 Perl을 사용한다는 말을 듣지 않으려면 http://perl-begin.org//tutorials/bad-elements/  도 함께 보시길 추천한다.

2010/11/10

흥미로운 프로젝트 OpenTSDB

오늘날 IT시스템들은 사용자와 시스템이 생산해내는 각종 컨텐츠와 데이터들의 홍수를 맞고 있다.

그래서 Hadoop처럼 NoSQL이니 하면서 Map,Reduce기술을 사용하여 대용량의 데이터를 빠르게 처리하기 위한 시도들이 나오고 있으며 이제는 그러한 기술들로 대용량 데이터를 다룬다는 것은 특별하지 않고 일상적인 일이 되어가고 있다.

IT운영조직은 방대해져 가는 IT서비스와 함께 방대해져 가는 IT자원들을 빈틈없이 모니터링해야 하는 상황에 이르렀는데 상용/오픈소스를 가릴 것 없이 고전적인 IT모니터링 솔루션들은 수천~수만대가 넘어가는 IT인프라를 모니터링하고 그 이력과 성능치들을 저장하고 검색하기에는 역부족인 상황이 다가오고 있다.( 일부 솔루션들은 분산화된 Polling 환경을 지원하기 하나 결국에 병목은 뒷단의 고전적인 데이터스토리지인 RRD file이나 RDBMS에서 오게 됨)


이러한 규모의 문제를 만나려면 적어도 수천대 이상의 서버/장비들을 운용해보지 않는 이상 힘들겠지만.. 그런데 이런 상황에 희망을 주는 프로젝트가 생겼다.

이름 하여 OpenTSDB

해당 싸이트는 OpenTSDB의 목적을 다음과 같이 얘기하고 있다.

OpenTSDB is a distributed, scalable Time Series Database (TSDB) written on top of HBase. OpenTSDB was written to address a common need: store, index and serve metrics collected from computer systems (network gear, operating systems, applications) at a large scale, and make this data easily accessible and graphable.

앞으로 이것이 모니터링에 있어 규모의 문제에 부딪힌 이들에게 희망을 줄 수 있을듯하다.

2010/11/08

screen session에 이름붙여 사용하기

UNIX에서 작업하다 보면 어떤 작업을 그대로 놔두고 로그아웃 했다가 나중에 다시 들어와서 보려면 가상 터미널 프로그램인 screen을 종종 사용하게 된다.

터미널에서 screen 명령을 내리면 새로운 세션이 생성되어서 들어가고 이것을 백그라운드?상태로 떼어내려면 ctrl+a를 누른후 d키를 누르면 원래 터미널로 돌아온다. 그리고 다시 떼어낸 특정 screen session에 들어가려면 screen -ls 명령을 내린후 세션넘버를 찾아서 screen -r 명령을 통해서 다시 진입한다.

aero@host:~$ screen -ls
There are screens on:
        7295.pts-0.sweetpea     (2010년 11월 08일 13시 56분 14초)       (Detached)
        7271.pts-0.sweetpea     (2010년 11월 08일 13시 55분 35초)       (Detached)
2 Sockets in /var/run/screen/S-aero.

aero@host:~$ screen -r 7271

하지만 이렇게 하면 어느 세션에 어떤 작업을 하는지 나중에 헷갈릴 수 가 있는데 세션번호 대신에 특정 의미있는 단어들을 세션이름으로 지정할 수 있으면 편리할 것이다.그렇게 하려면 다음 처럼 screen -S 세션이름 명령으로 세션이름을 지정해서 새로운 세션을 지정하면 된다.


aero@host:~$ screen -S DB
[detached from 7328.DB]
aero@host:~$ screen -S WEB
[detached from 7347.WEB]
aero@host:~$ screen -ls
There are screens on:
        7347.WEB        (2010년 11월 08일 14시 00분 33초)       (Detached)
        7328.DB (2010년 11월 08일 14시 00분 23초)       (Detached)
2 Sockets in /var/run/screen/S-aero.
aero@host:~$ screen -r DB

이제 -r 옵션에 세션이름을 지정해서 해당세션을 복구할 수 있다.

그러면 이미 떠있는 세션이름을 바꿀려면 어떻게 해야 할까?
방법은 두가지가 있다.

첫번째 방법은 해당 screen session에 들어간 다음 수동으로 ctrl+a 를 누른후 :sessionname 새로운세션이름 을 써서 바꾸는 방법이며 두번째 방법은 아래처럼 screen -ls에서 세션번호나 세션이름을 알아낸 다음처럼 -S 옵션으로 해당 세션번호나 이름을 지정하고 해당 세션에 명령을 날리는 -X 옵션으로 sessionname 새로운세션이름 수동으로 하던 명령을 날리는 것이다.

aero@host:~$ screen -ls
There is a screen on:
        7374.pts-0.sweetpea     (2010년 11월 08일 14시 03분 47초)       (Attached)
1 Socket in /var/run/screen/S-aero.

aero@host:~$ screen -S 7374 -X sessionname aero
aero@host:~$ screen -ls
There is a screen on:
        7374.aero       (2010년 11월 08일 14시 03분 47초)       (Detached)
1 Socket in /var/run/screen/S-aero.

2010/11/03

Parallelize a job with Parallel::Forker

In Opsview, Master and Slave monitoring servers collect perfdata from servers and parse and write to rrd files.

but I encountered rrd file writing timeout(12 seconds) as the number of rrd files increased.
So I started investigating where the performance bottleneck could be occurring ( We have multi-core CPU and there are no cpu or I/O bottlenecks ) and parallelized the time-consuming job in insert.pl like this with Parallel::Forker module.

Performance increases almost linearly with increasing N until you meet the limit of I/O bandwidth.


Original

JOB FLOW
perfdata in array -> iteration ( parse, write )
 [ @perfdata ]       [ processdata(@perfdata) ]

CODE
processdata(@perfdata);
debug( 5, 'INSERT nagiosgraph exited' );




Parallelized

JOB FLOW
perfdata in array -> split array into N -+-> array 0  -> iteration ( parse, write ) 
                                         +-> array 1  -> iteration ( parse, write ) 
                                         +->    .     -> iteration ( parse, write ) 
                                         +-> array N-1-> iteration ( parse, write ) 

CODE
use Parallel::Forker;

my $fork = Parallel::Forker->new;
$SIG{CHLD} = sub { Parallel::Forker::sig_child($fork); };
$SIG{TERM} = sub { $fork->kill_tree_all('TERM') if $fork && $fork->in_parent; die "Quitting...\n"; };

my $n = 4;
my @n_perfdata;

my $size = int(@perfdata/$n);
foreach ( 0 .. $n-1 ){
    $n_perfdata[$_] = [ splice @perfdata, 0, $size ];
}
push @{$n_perfdata[$n-1]}, @perfdata;

foreach ( 0..$#n_perfdata ) {
    $fork->schedule ( name => $_, run_on_start => \&child_sub )->run;
}

$fork->wait_all();

debug( 5, 'INSERT nagiosgraph exited' );

sub child_sub {
    processdata( @{ $n_perfdata[ $_[0]{name} ] } );
}