기본 콘텐츠로 건너뛰기

11월, 2008의 게시물 표시

숫자

스왑 당하기 싫어!

현존하는 많은 OS는 스왑 시스템을 사용한다. 스왑이 가지는 장점 가운데 하나는 실제 존재하는 물리적 메모리보다 더 많은 메모리를 사용할 수 있다는 것이다. 물론 그에 따른 속도 저하가 발생할 수 있지만, 다양한 전략과 하드웨어 발전으로 스왑 시스템이 가지는 단점을 보안할 수 있다. 리눅스에서 스왑 전략을 백분율로 설정할 수 있다. 간략한 설명은 이곳(http://purewell.egloos.com/2781667) 을 참조하자. 그외도 강박증 프로그래머는 POSIX 시스템에서 mlock함수를 이용할 수 있다. mlock은 일부 메모리 영역이 swap-out되는 것을 막아준다. 다만 swap-out을 할 수 있는 영역에 제한이 매우 크기 때문에 매우 작은 메모리 부분에 대해서만 mlock을 사용할 수 있다. CentOS 5.x에서 약 32킬로바이트 정도이다. 원본 위치: http://purewell.egloos.com/3992331

POSIX messagequeue

POSIX IPC에서 마지막-IPC는 이것 외에도 많다-으로 소개할 녀석은 메시지큐 이다. 간략히 뭐하는 녀석인지 설명하자면, ' 우선순위가 있는 줄서기 '랄까? 일단 Queue라는 말에서 이 녀석은 기본으로 먼저 던져넣은 메시지를 먼저 꺼내올 수 있다. 근데 가끔씩 긴급해 보내야할 메시지가 있을 수도 있을까...해서 메시지에 우선순위를 둘 수 있다. 그래서 때에 따라 우선순위가 높은 녀석이 나중에 큐에 들어갔는데도 먼저 나올 수 있다. 뭐 이런 녀석이다. 이 역시 SysV에서 뛰쳐나온 녀석이라서 SysV용 API가 있다. msgget으로 메시지큐 핸들을 얻어내어, msgsnd/msgrcv 등으로 적당히 메시지를 던지고 받을 수 있다. 이때 우선순위는 정수형으로 줄 수 있다. 다 사용한 메시지큐는 msgctl로 정리하여 OS에 반환할 수 있다. SysV 메시지큐 설명 끝. 역시나 내가 보고자 했던 것은 POSIX API. SysV 메시지큐 개념을 그대로 POSIX API에도 마련하였다. 메시지큐를 먼저 커널에 등록해야할 것이다. 이것은 이미 누누히 봤듯이 *_open 함수가 해줄 것 같다. 이 역시 mq_open함수가 그 일을 해준다. mqd_t mq_open(const char* name, int oflag, mode_t mode, struct mq_attr* attr); 뭐...뭔가 길다!? 반환값이 int가 아니라 mqd_t이긴 하지만, mqd_t 또한 int이다. 에러가 발생하면 (mqd_t)-1 을 반환한다. name, oflag, mode는 open함수 인자와 동일하다. name은 기존 shm_open, sem_open처럼 '/'로 시작하는 메시지큐 이름을 적는다. oflag에는 O_*로 시작하는 플래그를 OR연산으로 넣는다. oflag에 O_CREAT가 없으면 mode, attr 인자는 무시한다. mode는 파일을 생성할 때 접근제어이다. attr을 알아보기 위해 struct mq_attr을 살펴보자. struct mq

화면 갈무리 - 파이어폭스 확장기능

파이어폭스 1.5시절부터 2.x때까지 잘 쓰던 확장기능 가운데 하나는 GraphicsEx 이다. 이 녀석이 가지는 주 기능은 파이어폭스에서 그려진 웹 페이지 전체를 PNG파일로 갈무리 하는 것이다. 그러나 안타깝게도 제조사가 망했는지 홈페이지도 열리지 않고, 3.x용으로 업그래이드도 없다. 이 기능 하나 때문에 파이어폭스를 2.x로 다운그래이드 할 수는 없지 않은가. 그래서 이래저래 찾아본 결과 다양한 화면갈무리 확장이 있었고, 심지어 동영상으로 갈무리 해주는 녀석도 있었다. 이것저것 다 깔아보고 비교해본 결과 - 자세한 내용은 귀찮아서 생략한다 - iimmgg.com Tools 가 가장 적절해보였다. 적절히 모질라 확장기능 홈페이지에서 iimmgg로 찾아서 설치해서 쓰도록 하자. 아래는 내 블로그를 이것으로 전체문서 갈무리를 한 것이다. 원본 위치: http://purewell.egloos.com/3988067

정동영씨 복귀 바랍니다

‘복귀설 솔솔’ 정동영 전장관 그는 정치역정에 회한이 많은 듯했다. "나만큼 실패를 많이 해 본 정치인도 없을 것이다. 대선·총선도 실패했고, 진두지휘했던 지방선거에서도 졌다. 당의장도 두 차례나 중도하차했다. 영광은 짧았고 패배는 고통스러웠다." 그는 여전히 달변이었다. "하지만 실패를 두려워하고 머뭇거리지 않았다. 내 온몸을 다 던졌다. 감히 말하건대, 패배를 두려워하는 정치인은 아니었다." 그의 미국 생활은 칩거나 침잠보다는 학습과 준비 성격이 짙어 보였다. 정동영씨는 최선도 최악도 아니다. 최소한 어제보다 조금은 나은 정치 를 보여줄 사람 가운데 하나라고 본다. 얼른 복귀하길 바란다. 원본 위치: http://purewell.egloos.com/3988064

nscd가 CPU를 모두 먹고 있나요?

서버를 운영하다 보면 가끔씩 CPU를 100%씩 쳐드시는게 있다. 흔치 않지만 nscd 라는 녀석이 CPU를 홀로 와작와작 계~~~~~속 쳐드시는 경우가 있다. '나 혼자 그런거야? 설마~'라는 심정으로 구글에 검색해보니, 나 말고도 겪는 사람이 많은 듯. 일단 nscd라는 녀석이 뭐하는 녀석인지부터 알아야겠다. nscd는 Name Service Cache Daemon 이란 녀석이다. 각종 네임서비스(DNS나 ID/Password 같은) 효율을 높히기 위해 메모리에 와작와작 캐쉬해놓고 꺼내주는 녀석이다. 캐쉬를 보통 메모리에 올려놓기도 하지만, 매번 사람이 보기 쉬운 텍스트 파일을 해석해서 컴퓨터가 보기 편한 바이너리 파일로 저장해놓기도 한다. 아까 말한 CPU 100%는 이 바이너리 파일이 깨져서 nscd 내부적으로 어디선가 무한 루프를 돌고 있는 것이라고 생각할 수 있다. 마음 같아서는 내가 확 뜯어 고치고 싶긴 하지만, 소스 관리자가 내 소스를 받아줄지 의문이고... 일단은 간단한 미봉책이나 적어야겠다. 자주 발생하는 것이 아니니, 100%를 감지하면, 적당히 /var/db/nscd 디렉토리에 파일을 가볍게 날려주고 nscd를 재시작 해주자. 원본 위치: http://purewell.egloos.com/3966126

이 블로그의 인기 게시물

Bash Array, Map 정리

Bash에서 Array, Map에 대한 정리. (매번 찾기 귀찮) 찾아보진 않았지만, Bash에서 Array든 Map이든 동일하게 Map(C++에서 Unordered Map)으로 동작하는 것 같다. 왜냐하면, Array의 Index가 연속하지 않아도 동작한다. 그저 Key가 0 이상의 정수인 Map이랑 비슷하게 동작한다. 예) 1, 2, 3, 9, 10 Array # 생성 declare -a empty_array declare -a ar=(haha hoho baba "long string haha hoho") # 접근 echo "ar[0]=${ar[0]}" echo "all as array=${ar[@]}" # 큰따옴표 안에서 각 원소를 따로따로 전달한다. echo "all as one=${ar[*]}" # 큰따옴표 안에서 각 원소를 문자열 하나로 합쳐 전달한다. echo "indexes=${!ar[@]}" echo "indexes=${!ar[*]}" echo "length=${#ar[@]}" echo "length=${#ar[*]}" echo "last=${ar[-1]}" echo "last=${ar[@]: -1}" # 콜론 뒤에 빈 칸이 꼭 필요하다. 옛 방식 # 현재 상황 declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]="long string haha hoho") ar[100]=hello # 인덱스를 건너 뛰어도 동작한다. declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]=&

SQLite에서 파일 크기 줄이기

간단한 개인 프로젝트를 하고 있는데, SQLite DB파일 크기가 매우 커져서 테이블에 필요 없는 레코드를 날렸다. 그런데 날리고도 파일크기가 그대로라서 여기저기 뒤져보니 VACUUM 커맨드를 사용하란다. 사용법은 매우 간단하다. 그저 "VACUUM;"이라고 날려주면 동작한다. (참조: http://sqlite.org/lang_vacuum.html ) 다만, 동작이 매우 느려서 자주 쓸만한 것은 아니다. 실제로 100MB짜리 파일을 7KB로 줄이는데 수 분이 걸렸다. 소스를 봐야겠지만, DB를 EXPORT한 뒤에, 파일을 지우고 다시 IMPORT하는게 아닐까 하는 의구심이 든다. 매번 하기 귀찮으면 "PRAGMA auto_vacuum=1;"를 하면, 새로운 빈 페이지(DELETE나 DROP TABLE 같은...)가 생길 때마다, VACUUM을 실행한다. 다만, SQLite구조 문제로 테이블을 생성하기 전에 미리 날려야하는 안타까움이 있다. (참조: http://sqlite.org/pragma.html#pragma_auto_vacuum )

Java에서 클라이언트 인증받는 TLS/SSL 연결 만들기

열심히 OpenSSL 소스 까보면서 공부해서 Java로(??!) 소켓 연결 맺기 해보는 중이다... 물론 Java에서 SSLSocketFactory에서 SSLSocket을 만들어 Buffer 연결하고 깔작거리면 얼마나 좋으련만, 세상이 녹록치 않더라. TLS/SSL은 클라이언트가 서버를 인증하는 것도 있지만, 서버가 클라이언트 인증을 필요로 할 때도 있다. 그래서 이땐 클라이언트가 사전에 서버쪽이랑 깔짝거려서 발급받은 인증서를 미리 쥐고 있다가, 서버에 접속(정확히는 접속해서 Handshake과정에서)할 때 넘겨줘야한다. SSLSocketFactory에서 그냥 깔짝깔짝 하는 걸로는 어림 반푼어치가 없더라고... SSLSocket부터 올라가보니, SSLContext라는 익숙한 놈이 있고, 이놈을 만들려면 KeyManagerFactory가 있어야 하고 TrustManagerFactory도 있어야 하는데, 각각은 KeyStore를 필요로 하고, KeyStore는 PKCS12 인증서를 필요로 하더라... 학학학 일단 잡다한 소리 집어치우고, 암호 설정한 PKCS12 인증서를 준비하자. 참고로 암호 안 걸리면 인증서 읽다가 널뽀인따 맞고 죽더라. 인증서 내보내기(export)할 때 꼭 6자 이상 암호 걸어서 내보내자. 순서는 아래와 같다. KeyStore 객체를 PKCS12 알고리즘으로 생성하고, 준비한 인증서 파일을 읽는다. KeyManagerFactory 객체를 SunX509 알고리즘으로 생성하고, 1에서 만들어진 KeyStore로 초기화한다. TrustManagerFactory 객체를 SunX509 알고리즘으로 생성하고, 1에서 만들어진 KeyStore로 초기화한다. SSLContext를 TLS 알고리즘(또는 필요에 따라 다른 것도 가능)으로 생성하고, 2, 3에서 만들어진 KeyManagerFactory와 TrustManagerFactory를 통해 만든 KeyManager[]와 TrustManager[]로 초기화한다. S