화요일, 12월 22, 2009

사람 판단에도 용기가 필요

사람에 대하여 좋게 판단하는 것은 그닥 어려운 일이 아니다.

칭찬으로 북돋우고 잘하도록 환경을 갖추어주는 데 신경쓰면 된다.

나쁘게 판단하는 것은 쉽지 않다.
줄을 세우고, 더 낫고 나쁘고를 구분하고, 또 궁극적으로는 어떤 역할에 대한 적합 여부를 결정해야 할 때는 더욱 어렵다.

하지만, 부적합한 역할을 그냥 맡겨두면 결국 시간만 잃어버릴 뿐, 문제가 불거지고 당사자로서도 결국 시간만 버린 채 맞지 않는 역할을 오래 지속할 수는 없다.

그래서 적부 판단은 신중을 요구하지만 과감해야 한다.

여태의 경험들이 모두 alert을 주고 있지만, 혹시나 잘할 수도 있지 않을까 하는 기대감은 또다른 시간을 낭비하고 우유부단함으로 더큰 아픔을 뒤늦은 시간에 결과한다.

잘할 수도 있겠지만, 여태까지의 모든 징후들은 그렇지 않다고 얘기할 때 과감하게 시간을 제약해서 판단을 내리는 게 좋겠다.

그 시간 동안에 큰 전환점을 맞을 수도 있겠지만 그것보다는 스스로를 부적합하게 만들었던 그 연유로 또다시 문제의 근원이 될 가능성이 지배한다.

사람에 대한 판단은 여러 가능성을 열어둬야겠기에 단정해서는 안되지만, 서둘러 판단하길 주저해서는 안된다.

화요일, 12월 08, 2009

JVM Garbage Collection Tuning

몇 가지 기본적인 GC 튜닝 방법을 적어봅니다.

1. Concurrent Mark and Sweep 알고리즘에서 class unloading 문제

대충 아래와 같은 옵션으로 실행되는 자바 서버 프로세스가 있다고 가정하자.

-XX:+UseParNewGC -XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC

이것은 old generation에 대해서 CMS 알고리즘을 사용하기 위한 튜닝 방법이다.
그런데 다음 내용을 보면 CMS GC를 사용할 때 기본값으로 class unloading 즉, perm gc를 안 하도록 되어 있다.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6329603

해결책은 다음 옵션을 추가하는 것이다.

-XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled

2. 트랜잭션이 많고 해당 객체들의 lifespan은 짧을 경우의 튜닝 (Sun Hotspot JVM. HP JVM도 마찬가지)
  • 새로운 객체들이 많이 생성되고 또 트랜잭션양이 많은 경우 Thruput 중심의 garbage collector를 사용해야 하기 때문에 기본값인 UseParallelGC 옵션은 그냥 사용하면 될 것 같고..
  • Parallel GC Thread 갯수는 CPU 갯수와 동일하게 혹은 2배 정도로 증가시킬 필요가 있다. 예를 들어 CPU가 6장이라면
    -XX:ParallelGCThreads=12
  • eden 과 tenured의 비율을 지정하는 옵션인 NewRatio 옵션이 기본값인 2인데 eden이 계속 부족해질 가능성이 높으므로 NewRatio 값을 1 정도로 하여 eden과 tenured 비율이 같도록 하는 게 좋겠다. (1.5가 먹는지 모르겠음 ㅠ_ㅠ)
    -XX:NewRatio=1
  • 위의 옵션들은 주로 young generation의 처리 성능을 높여 thruput을 높이는 목적을 가지고 있는데 full gc 가 발생하면 old generation까지 collection 대상이 된다. 기본값은 old gen에 대해서는 serial collector 즉, single thread 방식이므로 pause time이 길 수 있는데 JDK 5.0update6 (SUN JVM 기준)부터는 parallel old gc 기능이 추가되었다. 이 기능을 사용하려면 다음 옵션을 추가해야 한다. 이 옵션은 young generation에 대해 UseParallelGC 옵션이 사용되는 경우에만 가능하다.
    -XX:+UseParallelOldGC
    HP JVM의 경우 Sun JDK 5.0u6에 해당하는 JVM 버전은 5.0update4이다.
  • 그외 jconsole을 써서 모니터링할 수 있으려면 해당 JVM을 실행할 때 다음 옵션을 켜줘야 한다.
    -Dcom.sun.management.jmxremote
  • 메모리 문제(OutOfMemoryError)가 발생할 경우 heap 분석을 위해서는 다음 옵션 추가하는 것 빼먹지 말아야 한다. -XX:+HeapDumpOnOutOfMemoryError

3. IBM JVM의 경우 튜닝

IBM JVM 은 gc 특성이 Sun/HP와는 완전히 다르다. -verbosegc 옵션을 켜면 기본값으로 standard error로 gc log를 내보내는데 verbose gc 로그의 timestamp는 gc가 시작한 시간을 나타낸다. IBM JDK는 gc 때에는 무조건 stop the world 즉, 다른 일을 할 수 없는 상태가 된다. (이런 면에서는 Sun의 HotSpot에 비해 뒤처진다고 보여짐.) gc log에서 <sys 라고 되어 있는 부분은 System.gc 가 호출된 것이고 <af 라고 되어 있는 부분은 allocation failure 즉, 메모리 부족에 의해 garbage collection이 trigger되는 경우이다. 자세한 것은 IBM JDK diagnosis 문서 참조.

  • verbose gc log를 다른 파일로 쓰려면 다음 옵션을 추가
    -Xverbosegclog:<파일경로>
  • GC 정책을 지정하는 옵션은 다음과 같다.
    -Xgcpolicy:<정책 이름>
  • 위의 정책 이름 중 가능한 것은 다음과 같다.
    optthruput : 기본값. 이 알고리즘은 gc pause time이 긴 게 흠이다. mark and sweep 시 mark 하는 부분이 single thread로밖에 실행할 수 없어 가끔씩 매우 긴 pause time이 발생한다.
    optavgpause : heap이 클 경우에 gc pause time을 줄이기 위해 사용하는 옵션
    gencon : gc pause time을 최소화하는 옵션
    subpool : 성능적으로 더 우수한 object allocation 알고리즘을 사용. 큰 SMP 시스템에 유용(CPU 16장 등...) AIX, Linux PPC, zSeries, z/OS, i5/OS 에만 사용 가능하며 이 알고리즘에서는 LOA(large object area)를 사용하지 않는다.
    보통 기본값인 optthruput이 적용되어 있으니, pause time이 너무 길다면 optavgpause 나 gencon을 사용하는 게 좋겠다.
  • GC 쓰레드 갯수는 다음 옵션을 사용하여 지정한다.
    -Xgcthreads<쓰레드 갯수>
    기본값으로 CPU 갯수만큼 사용하게 되어 있다. 필요하다면 CPU 갯수의 2배 정도로 쓰레드 갯수를 지정하면 좀더 효율이 높을 것이다.
  • LOA / SOA 비율 지정
    -Xloainitial<퍼센트>, -Xloamaximum<퍼센트>
    IBM JVM에서 tenured 영역은 soa(small object area)와 loa로 구분된다. 그 초기 및 최대 비율을 LOA : SOA로 지정한다. 기본값은 초기는 0.05 (혹은 5%)이고, 최대는 0.5 (혹은 50%)이다. 0과 0.95 사이의 값을 지정해야 한다. LOA를 많이 사용하지 않는다면 기본값을 그대로 사용하면 된다.
  • 예를 들자면 다음과 같이 지정할 수 있다.
    -verbose:gc -Xverbosegclog:<파일경로> -Xgcpolicy:optavgpause -Xgcthreads8

4. 참고 자료
추가 (2013-03-29)
Hotspot JVM은 JDK 6에서는 큰 변화가 없었네요.
  • Hotspot JVM Tuning Guide (JDK 6.0 기준)
    • http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
IBM JDK에 추가된 gencon은 Hotspot에 이미 구현된  generatioinal collector 인데 IBM JDK 7에서는 gencon을 기본값으로 권장하고 있다.  이 경우 hotspot JVM의 경우처럼 new area의 크기를 지정해줘야 한다.  -Xmns 는 new area의 초기값,  -Xmnx는 new area의 최대값이다. 32bit JVM은 256MB - 512MB, 64bit JVM은 512MB - 1024MB 사이의 크기가 가능하다. 64bit JVM에서 32bit 방식의 addressing을 사용하는 옵션은 -XcompressedRefs 를 켜면 훨씬 효율적인 성능을 보이는데 이 경우 최대 힙 크기는 28GB로 제약된다.

다 빈치, 힘겨울 때도 웃을 수 있어야 한다

얼마 전 과천에 있는 서울과학관에 갔다가 레오나르도 다빈치 특별전을 관람하였다.
미술가이기 이전에 과학자인 다 빈치의 면밀한 사고와 그 생각들을 기록한 노트는 여러 모로 감명을 주었다.

"I love those who can smile in trouble, who can gather strength from distress, and grow brave by reflection. 'Tis the business of little minds to shrink, but they whose heart is firm, and whose conscience approves their conduct, will pursue their principles unto death."


힘들 때 웃을 수 있는 사람, 고통 속에서도 힘을 얻는 사람, 성찰을 통해 용감해지는 사람을 사랑한다.
움츠려드는 것은 소인배의 일이며, 의지가 확고하고 분별에 따라 행동하는 사람은 스스로의 원칙을 목숨을 걸고 추구한다.

Life is pretty simple: You do some stuff. Most fails. Some works. You do more of what works. If it works big, others quickly copy it. Then you do something else. The trick is the doing something else.


인생은 단순하다. 뭔가를 한다. 대부분 실패한다. 일부는 동작한다. 동작한 것들을 좀더 해본다. 만약 멋지게 동작한다면, 다른 이들이 재빨리 베낄 것이다. 그렇다면 다른 것을 해본다. 이렇게 다른 것을 해보는 것이 관건이다.

PS.
다 빈치의 삶을 보면서 인생을 어떻게 소비할 것인가 스스로 질문해본다.
힘을 써서 살 것이 아니라 지적 활동을 중심으로 살아야 한다. 많은 생각을 이어가고 기록하고 다시 재구성하여 더 나은 가치를 생산해야 한다.
생각과 기록의 연속.. 인터넷의 발전이 가져온 지식의 대단한 접근성을 좀더 활용하고, 기록을 체계화하고 high level view를 잘 정리하는 일들을 통해 좀더 나은 가치를 만들 수 있지 않을까 생각해본다.

월요일, 12월 07, 2009

바늘 하나 꽂을 자리 없구나

달마 대사의 <달마혈맥론>

心心心難可尋 심심심난가득
寬時偏法界 관시변법계
窄也不用鍼 착야불용침

마음! 마음! 마음! 그 마음을 알 수 없구나!
마음이 너그러울 땐 천하(법계)를 다 포용(덮지만)하지만
마음이 옹졸하면 바늘하나 꽂을 자리가 없구나

아래에서 발췌해왔습니다.
http://www.kilsangsa.or.kr/zero/view.php?id=temp_board&page=10&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=429

옹졸해질 때에는 바늘 꽂을 구석이 없네요.
어떤 결정도 내릴 수가 없을 때에는 시간과 공간을 잠시 피하는 게 지혜롭겠지요.

금요일, 12월 04, 2009

Good Communications

의사 소통에 필요한 능력과 교수에 필요한 능력은 유사한 측면이 있으나 같지는 않다.

교수는 내가 이해하고 있는 개념과 사고 체계를 다른 사람에게 전달하고 또 이해시키는 기술을 뜻하며, 교수 과정 역시 지식의 전달을 위한 한쪽 방향으로의 의사 소통 형태라고 볼 수 있으나, 일반적인 소통이란 표현은 나의 의견을 전달하고, 또 다른 사람의 의견을 이해하는 쌍방향 기술을 뜻하기 때문이다.
다시 말해 교수 과정은 단방향 의사 소통의 예라고 볼 수 있다.

의사 소통은 먼저, 자신의 사고 체계를 개념화하여 정확하게 기술하는 것부터 출발한다. 사고 체계가 분명할수록 정확한 소통을 할 수 있다. 즉, 의사 소통의 첫 단계는 전달할 내용을 스스로 분명하게 refine하는 것이다.
그리고 이를 상대방에게 전달하기 위한 효과적인 방법과 수단을 사용한다.
전달의 기법에는 여러 가지 형태의 강조가 사용된다. 논리적 추상화를 돕기 위한 은유(metaphor)의 도입, 명제의 강렬한 대비, 예시, 도해, 말이나 몸짓을 사용한 강조, 반복, 이해를 돕고 분위기를 환기하기 위한 간접적인 스토리의 전달, 논리적 진위 증명 등등 여러 가지 강조 방법을 사용할 수 있다.
이 과정에서 상대와의 소통 정도를 측정하기 위한 interactive method가 보완적으로 사용될 수 있다. 즉, 계속해서 상대의 청취 상태나, 이해 정도를 확인하기 위한 참여를 이끌어내는 것이다.
상대의 상태에 따른 완급 조절이나 중간 중간 이해 정도 테스트를 포함시키는 것 등의 방법이 여기에 포함된다.

그렇다면 좋은 의사 소통은 이러한 방법만으로 이루어지는 것일까?
양방향으로 의사 소통을 하기 위해서는 위의 과정에서 빠진 상대방의 의견을 이해하는 과정과 또, 여러 의견을 조율하는 과정이 포함된다.

즉, 나는 지식과 논리의 전달자로서만 역할하는 것이 아니라, 의견의 청취자이자 판단자, 새로운 논리 체계의 구성원으로 역할하게 된다.

양방향 소통에서는 지식과 논리 전달 자체가 feedback을 자연스럽게 수반한다.
논리 체계의 상호 교류가 정확하게 이루어지기 위해서는 전달자로서의 역할 뿐 아니라 청취자로서의 역할을 분명하게 해야 하며, 이 두 가지 역할 속에서 의사 결정에 대한 기준과 주장을 뒷받침할 근거에 대한 판별 방법을 분명하게 해야 한다.

소통은 기본적으로 의사를 교환하는 것으로 이루어지는 것이지만, 많은 소통은 상호 이해만을 목적으로 하지 않고, 나아가 의사 결정의 신뢰성을 뒷받침하는 역할을 한다.
그러한 의미에서 의사 결정이 정확한 소통 위에서 이루어졌느냐가 항상 논쟁거리가 된다.
물론 의사 결정이란 소통에 기반하지 않고 진위라든가 추정에 기반하는 경우도 많다.
하지만, 결정이 소통을 필요로 한 경우, 조금의 소통 부족은 사람들의 세상에서는 고립을 뜻하게 되고 신뢰를 잃게 된다.
결정 혹은 판단에 과학적 방법을 도입한다고 하더라도 근거가 되는 사실들은 소통을 통해 도출되는 경우가 사람들 사이의 일에서는 많은 부분을 차지하기 때문이다.

P.S, 지도 방법에 대한 반성과 함께...

수요일, 12월 02, 2009

WE BELIEVE, 노무현 대통령 추모곡

"락별"이 부른 노무현 대통령 추모곡이라고 하네요. 늦었지만 기억 속에서 떠나보내기 전에 기록해둡니다.

WE BELIEVE.



추모 영상 하나...

스티브 잡스 2005 스탠포드 대학 연설

스티브 잡스의 2005년 스탠포드 대학교 졸업식 축사

Stay Hungry, Stay Foolish

http://www.youtube.com/watch?v=Hd_ptbiPoXM



한글 자막은 아래에서 볼 수 있습니다.

http://sensafeel.tistory.com/85

P.S. iPhone 국내 상륙과 더불어 그 매력적인 인터페이스를 보면서 스티브 잡스의 진정한 가치를 다시 생각해봅니다.