WITH(UPDLOCK) 힌트와 MSSQL에서 락 해제하는 방법

MSSQL에서 의도치 않게 락이 걸리는 상황이 발생했다. 내가 만든게 아니니 뭐…

에러가 나는 프로시져를 찾아보니 UPDATE 쿼리에서 WITH(UPDLOCK) 구분이 있었다.

쭈기님의 블로그에 있는 글 (http://jjugi0606.tistory.com/30)에 의하면 이 힌트를 쓰는 경우, WHERE 검색에 들어가는 컬럼들은 인덱스 설정이 되어야만 한다고 한다. 그래서 인덱스를 일단 설정. 앞으로 또 락이 걸리는지는 두고봐야 알 수 있을 것 같다.

어찌됐던 MSSQL에서 걸려있는 락을 해제하기 위한 방법도 찾아보았다. 이 글 (http://yongandju.tistory.com/74)에서 방법을 찾았다.

EXEC sp_lock

명령어를 통해 락이 걸린 부분을 찾는다. (Mode 부분이 X 표시가 된 것이 락이 걸린 것이다.)

dbcc inputbuffer(해당 spid)

를 입력해서 어떤 쿼리에서 락이 걸렸는지 확인한다.

kill 해당spid

를 입력해서 강제종료시킨다.

어찌됐던 위 과정을 통해서 락은 해제되었다.

가상화를 위한 준비 #2 – 네트워크

가상화를 위한 준비에서 네트워크 준비에 대해 고민을 많이 했다.

인터넷에서 찾아본 대부분의 문서들이 가정에서 공유기 밑에 ESXi를 설치하는 문서만 있었기에 거의 도움이 되지 않았다. 공유기 밑에서 DHCP 환경으로 ESXi를 설치하는 것은 별로 어려운 일이 아닐뿐더러, IP가 계속 할당되기 때문에 IP에 대해서도 고민할 필요가 거의 없다.

난 IDC에 서버를 넣어야하고 고정IP가 제한적으로 부여되기 때문에 어려움이 많았다.

[gads_468x60]

여기서 중요한 것은 ESXi를 관리하는데에 쓰이는 IP와 실제 서버에 사용될 IP, 즉 최소 2개 이상의 IP가 확보되어야만 ESXi를 사용할 수가 있다. 이 사실을 아주 오랜 시간과 실패 끝에 알아냈다. 인터넷에 있던 문서들은 공유기 밑에서 사용했으므로 이러한 문제를 하나도 겪지 않았을 것이다. IP 하나로는 ESXi를 운영할 수가 없는데 그 이유는 다음과 같다.

  1. ESXi 서버는 자체적으로 80, 443, 22번 등의 중요한 포트를 관리용 포트로 사용한다.
  2. 그 포트 번호를 다른 포트 번호로 바꿀 수 없다면 이 포트를 해당 IP의 서비스 포트로 사용할 수가 없다는 얘기가 된다.
  3. VMWare의 kb에는 이 포트번호들을 바꾸는 방법이 설명되어 있으나 실제로는 적용 되지 않는다.

결론적으로 3번을 시도하느라 엄청난 시도와 실패를 경험하고 VMWare에서 만든 문서가 잘못되어 있다는 결론이 났다. 아이피가 2개이면 이 모든 문제를 고민할 필요가 없어지게 된다.

그래서 IDC와 계약시 부여받은 IP는 3개였다. 하나는 ESXi의 관리용으로, 하나는 서비스용으로, 하나는 예비용으로 사용하고 있다. ESXi를 설치할 때 관리용 IP로 입력을 하고, ESXi 위에서 NAT와 방화벽을 담당할 서버에 서비스용 IP를 부여했다.

부디 ESXi를 실제 서비스에 응용하는 사람들은 나 같은 실패를 겪지 않기를.

가상화를 위한 준비 #1 – 서버 하드웨어

가상화를 위한 서버 하드웨어와 네트워크를 준비할 때의 참고사항을 정리해본다.

[gads_468x60]

일단 서버 하드웨어를 준비해야했다.

보유하고 있는 서버는 HP DL120G7 기본형 모델이었다. Intel Xeon E3-1220 프로세서와 4GB ECC 메모리, 250GB 하드디스크를 장착한 1U 사이즈 서버이다.

ESXi를 설치해서 게스트 운영체제들을 운영할 때 중요한 것은 CPU보다는 메모리와 디스크이다.

메모리

c03186237

메모리는 게스트 운영체제마다 개별적으로 쓰는 부분이라 내가 설치할 게스트 운영체제들이 모두 쓸 메모리의 크기에 예비용 메모리량과 시스템이 사용하는 메모리량을 고려해야한다. ESXi도 일종의 운영체제이므로 메모리를 사용하게 된다. ESXi를 실제 운영시에는 2.5GB 정도 사용하고 있으나 약 4GB 정도는 ESXi가 쓴다고 예측하면 좋을 것 같다. 참고로 ESXi는 4GB 미만의 메모리에서는 설치 자체가 되지 않는다. 4GB의 메모리를 가지고 있다 하더래도 비디오메모리 등으로 공유메모리가 나가게 되어 실제 가용메모리가 4GB가 되지 않으면 설치가 되지 않는다. 결국 메모리는 8GB ECC 메모리를 4개 장착해서 32GB로 설치했다.

하드디스크

western-digital-blue-wd10ezex-hard-drive

디스크는 사실 요새 가격이 너무 떨어졌기 때문에 용량을 증설하는데에는 어려움이 없으나 가상화를 하게되면 디스크 속도가 저하되므로 이에 대해 고민해봐야한다. 많은 커뮤니티 사이트들과 카페를 돌아다녔을 때, SSD로 하면 쾌적한 성능이 나온다고 되어있으나 여유롭게 운영체제를 이것저것 설치해보기에는 SSD는 비용이 너무 많이 든다는 문제가 있었다. 결론적으로 하드디스크는 기존에 설치되어있던 하드디스크를 모두 제거하고 Western Digital의 7200RPM 1TB 하드디스크를 두개 구입하여 넣었다. 차후에도 디스크를 더 추가할 계획을 가지고 있다.

실제 운영 상황에서 CPU는 아직까지 크게 모자라지 않았으나 예측대로 메모리는 많이 소모되었다. 디스크는 스왑메모리 때문에 그런지 생각보다 공간이 많이 소모되었다. 디스크를 처음부터 크게 장착하는 것이 좋을 것 같다.

이정도 하드웨어를 준비해서 실제 운영을 시작했는데 사실 자원은 굉장히 여유로웠다. 대부분의 경우에 CPU는 모든 서버들의 사용량 총합이 500MHz가 채 되지 않았다. 이걸 본다면 막강한 CPU를 장착하고도 효율적으로 쓰지 못하는 서버들이 얼마나 많은지 알만하다.

Visual Assist X Snippet 기능을 이용해 Doxygen 주석 자동 입력하기

Visual Studio 2012에 Visual Assist를 설치하여 사용하면서 가장 쓸모있는 기능중 하나는 Snippet 기능이다.

Snippet 기능을 이용하여 특정 함수에 주석을 달 때 Doxygen 형식의 주석을 자동으로 삽입하게 할 수 있다. Snippet을 설정하려면 Visual Studio의 VASSISTX 메뉴에서 다음처럼 들어간다.

Visual Assist X

‘Edit VA Snippets…’ 메뉴에 들어간다. VA Snippet Editor 화면이 열리면 왼쪽 트리메뉴 중 C++를 선택하고 Refactor Document Method를 선택한다.

K-68

오른쪽 하단의 주석 내용들이 함수 설명으로 들어갈 부분들이다.

비주얼 스튜디오의 ‘도구’ -> ‘옵션’을 눌러 옵션창을 연다.

K-69

옵션 창에서 ‘환경’ -> ‘키보드’를 선택한 다음, ‘다음 문자열을 포함하는 명령 표시’에 RefactorDocumentMethod를 입력하면 Visual Assist X의 Refactor Document Method 가 검색된다.

‘바로 가기 키 누르기’ 밑의 하얀 텍스트 박스를 클릭한 다음, 자기가 원하는 단축키를 입력하고 ‘할당’ 버튼을 클릭한다. 내 경우에는 Shift + Alt + M으로 설정해놓는다.

이제 비주얼 스튜디오로 와서 함수 위에 커서를 놓고 방금 설정한 단축키를 누르면 다음과 같이 자동으로 주석이 입력된다.

K-70

주석의 모양이라던가 입력 방식을 바꾸고 싶다면 다시 Edit Snippet 창에 가서 수정해주면 바로 반영된다. 지금 이 입력 양식은 디폴트 양식으로 입력하였으나 나중의 문서화를 위해서는 Doxygen 형식을 참조하여 입력하는 것이 좋다고 생각한다.

스니펫에 입력 가능한 매크로에 대해서는 이곳을 참조하면 될 것 같다.

가상화 하이퍼바이저의 선택

서버를 가상화하기로 생각하고 처음 생각한건 가상화 하이퍼바이저의 선택이었다. (위키피디아 : 하이퍼바이저)

하이퍼바이저의 선택이 잘못되었을 때 나중에 바꾼다는건 굉장히 어렵고 복잡하므로 처음 선택이 중요하다.

내가 회사에서 사용하고 있던 것은 VMWare의 ESXi 5.0이었고 이번에 바꾸기 위해 몇가지 하이퍼바이저를 찾아보고 조사해보았다.

Microsoft – Hyper-V

mshv-overview

마이크로소프트의 하이퍼브이 시스템.(http://www.microsoft.com/ko-kr/server-cloud/solutions/virtualization.aspx)

HyperV_Homepage

장점은 익숙한 윈도우GUI를 그대로 이용할 수 있다는 것. 시중에 이미 Hyper-V를 다루는 기술이라는 하이퍼브이에 관련된 책이 나와있기 때문에 참고하기 쉽다는 점이 있었다. 실제로 교보문고에 가서 이 책을 잠시 읽어봤는데 내용도 상당히 괜찮았다.

하지만 단점도 있다. 하이퍼브이는 하이퍼브이를 지원하는 운영체제만 공식지원하고 있다. (참고 : http://technet.microsoft.com/ko-kr/library/cc794868(v=ws.10).aspx) 게스트 운영체제가 이를 지원하지 않으면 사용상 애로사항이 생길 우려가 보였다. 또한, 사실상 콘솔모드로 작동하는 Windows Hyper-V를 쓰지 않으면 Windows 서버 운영체제를 구입해야한다는 경제적인 문제도 고려해야했다.

Xen Project – XenServer

xen_project_logo_384x157

Citrix사에서 시작된 Xen Project의 XenServer. (http://www.xenproject.org)

Xen_Homepage

XenServer는 국내외에서 많이 사용되고 있다. 가장 유명한 아마존 AWS도 Xen을 사용하고 있고 KT의 ucloud시스템도 Xen을 이용하고 있다고 한다. 반가상화 시스템에서 오는 성능적인 장점이 굉장히 크다고 한다.

사실 ESXi를 설치해보다가 Xen도 한번 설치해본 것인데, 기본적인 설치방법이라던가 설치한 이후 화면에 나오는 것은 ESXi와 별반 다르지 않다. 단지 ESXi는 노랑색 화면이 나오고 Xen은 옅은 회색 화면으로 나온다는 정도?

장점은 전가상화가 아닌 반가상화이기 때문에 성능이 매우 좋다는 점. 여러 업체가 쓰고 있다는 사실만으로 믿음직하다는 점이다. 그럼에도 내가 Xen으로 가지 않은 이유는, 사용상 너무 불편하다. 특히 ESXi와 비교해서 너무 불편했는데, 가상운영체제를 설치하려고 할 때 ESXi는 ISO 파일을 그냥 업로드한 다음 마운트 해주면 그만이지만, Xen은 ISO파일을 올리고 그것을 공유디렉토리로 마운트 하는 식으로만 접근이 가능했다. 왜 이런식의 접근을 요구하는지 잘 모르겠으나 어쩄튼 사용방법이 너무 번거롭고 귀찮아서 제외하기로 결정.

VMWare – ESXi

esxi-dedicated-server-icon

VMWare의 ESXi. (http://www.vmware.com/kr/products/vsphere-hypervisor)

VMWare_Homepage

가상화 체제에서 아직까지는 최고로 유명한 ESXi. 사실 내가 계속 사용해온 것이기도 하고 위 두가지와 비교했을 때 사용상 제일 편리했다.

장점은 편리한 사용방법, 인터넷에 자료가 많다는 점. 전세계적으로도 많이 쓰이고 있다는 점, 그리고 전가상화 시스템이기 때문에 위 두 운영체제와는 달리 어떤 운영체제도 지원한다는 점이 제일 좋았다. 사실 어떤 운영체제든 다 지원한다고는 할 수 없겠으나 vSphere Client에서 지원하는 운영체제는 현존하는 대부분의 메이저 운영체제들은 다 지원한다고 봐도 무방하다. 그리고 ESXi는 무료로 배포되고 있다. 다만, 라이센스는 무료로 발급 받을 수 있으나 사용상의 제약조건이 존재한다. 단점은 전가상화로 인해 성능은 약간 낮다는 점이 있었다.

그래서 결국 무엇을 선택했는가.

결론적으로는 VMWare ESXi를 선택했다. 세가지 비교 결과 성능은 약간 낮을 수 있지만, 일단 사용상으로 불편하다면 계속 사용하지 않게 될 수 밖에 없었다. 더군다나 내 서버는 서비스용 서버라기 보다는 공부용 성격이 강하기 때문에 이런 저런 운영체제를 자유자재로 설치했다 지웠다 하게 되는데 Xen의 경우는 이게 너무나 불편해서 제외하게 되었다. 만약 성능을 중시한다면 Xen이 가장 좋은 선택이 아닐까 싶다. 하여튼 난 Hyper-V와 ESXi 중에 선택을 해야했는데 Hyper-V는 공식적으로 지원하는 운영체제가 제한적이었다. 사실 공식지원을 안하는 것이지 설치 자체는 잘 될 것 같지만 그래도 일단 기분이 다르니까. 만약 윈도우를 못 벗어나겠다거나 윈도우만 써야겠다, 난 MS가 신뢰가 간다면 Hyper-V를 선택해야할 것 같다.

결국에는 손에 제일 익었고 내가 사용할 상황에 가장 적절한 ESXi를 선택하고 지금도 잘 사용하고 있지만 나중에는 한번 Xen이나 Hyper-V도 설치해서 살펴봐야할 것 같다.

std::thread 사용법

간단히 스레드를 만들어 테스트 해야할 일이 있어 std::thread를 찾아보고 만들어봤다.

예전에는 boost::thread를 이용했었는데 C++11에 오면서 아예 다 내장되었다는게 놀랍고 신기하다.

#include <iostream>
#include <thread>
#include <windows.h>

char* target_msg = "test";
char msg[1024] = {0,};

void callback_function(int thread_num)
{
    while(true)
    {
        strcpy_s(msg, target_msg);
        //std::cout << "copy (" << thread_num << ")" << std::endl;
        Sleep(10);
    }
}

int main(void)
{
    std::thread thread1(callback_function, 1);
    std::thread thread2(callback_function, 2);

    thread1.join();
    thread2.join();

    return 0;
}

mod_ruid2 설치 방법

Apache 2 버전에서 mod_ruid2 를 설치하기로 했다.

https://github.com/mind04/mod-ruid2 에 가서 최신버전의 zip 파일을 다운로드한다. 다운로드한 파일을 서버에 올리고 unzip master.zip 명령을 내려 압축을 해제한다. 이 글을 쓰고 있는 시점에 최신 버전은 0.9.8 버전이다.

참고로, 내 서버의 환경은 CentOS 6.5 이며 모든 최신업데이트가 전부 적용되어 있다. Apache는 CentOS에서 제공하는 아파치를 사용하고 있다.

apxs -a -i -l cap -c mod_ruid2.c 명령을 내리면 컴파일이 시작된다.

----------------------------------------------------------------------
 Libraries have been installed in:
 /usr/lib64/httpd/modules
 If you ever happen to want to link against installed libraries
 in a given directory, LIBDIR, you must either use libtool, and
 specify the full pathname of the library, or use the `-LLIBDIR'
 flag during linking and do at least one of the following:
 - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
 during execution
 - add LIBDIR to the `LD_RUN_PATH' environment variable
 during linking
 - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
 - have your system administrator add LIBDIR to `/etc/ld.so.conf'
 See any operating system documentation about shared libraries for
 more information, such as the ld(1) and ld.so(8) manual pages.
 ----------------------------------------------------------------------
 chmod 755 /usr/lib64/httpd/modules/mod_ruid2.so
 [activating module `ruid2' in /etc/httpd/conf/httpd.conf]
 [root@83rpm mod_ruid2-0.9.8]#

메시지가 나오고 컴파일이 종료된다.

혹시 sys/capability.h 파일이 없다는 메시지가 나온다면 lilbcap-dev 패키지를 설치하면 해결된다.

아파치 폴더의 httpd.conf 를 보면,

LoadModule ruid2_module       /usr/lib64/httpd/modules/mod_ruid2.so

처럼 모듈 로딩 명령이 들어가 있다.

가상호스트 설정에 들어가서 다음의 내용을 추가한다.

<IfModule mod_ruid2.c>
RMode config
RUidGid 원하는유저ID 원하는그룹ID
</IfModule>

다 입력했다면 아파치 서버를 재시작하고 다음의 내용의 PHP 파일을 만들어서 제대로 작동하는지 확인한다.

<?php
 makedir("testdir");
 ?>

이 내용은 http://fullpowe.blog.me/10158911404 를 참조했다.

추가. 위 php 파일의 makedir() 함수로 테스트를 하려했으나 mod_security 모듈에 의한 보안정책 위반으로 제대로 실행되지 않았다. 자체적으로 테스트해본 결과, mod_ruid2 모듈은 정상적으로 작동하는 것을 확인하였다.

윈도우에서 C++ Boost 사용하기

윈도우에서 C++ 작업시 유용한 Boost 라이브러리를 사용하기 위해서는 빌드를 해야한다. 파일시스템 등을 다루는 등의 운영체제에 의존하는 기능들을 사용하기 위해 빌드해야한다고 한다.

  1. http://www.boost.org 에 들어가서 Boost를 다운 받는다.
  2. 압축을 풀고 디렉토리에 들어가 bootstrap.bat 를 실행한다.
  3. b2 –help 를 실행해서 한번 도움말을 쭉 읽어본다.
  4. 윈도우 커맨드창을 열고 해당 다음의 명령을 입력하여 빌드를 시작한다. 64비트, 디버그/릴리즈 모두, 멀티쓰레드, MPI 사용 안함으로 빌드한다.
  5. b2 variant=debug,release link=static,shared threading=multi address-model=64 –without-mpi -j8 stage
  6. 빌드 옵션은 여러가지가 더 있다. 찾아봐서 자기가 필요한대로 설정한다.
  7. -j8은 몇개의 작업을 동시에 하는지를 결정한다. 4코어인 경우에는 -j4를 해주면 모든 코어를 다 사용하게 된다. 적당하게 설정하는 것이 좋다.

빌드에는 시간이 꽤 걸린다.

다음의 링크를 참조했다.

MySQL에서 현재 시간 자동 입력 방법

MySQL에서 현재 시간을 구하고 자동으로 입력하려면 다음의 쿼리를 이용한다.

INSERT INTO time_test VALUES ((SELECT NOW()));

로그 정보를 DB에 입력할 때 유용하게 사용했다. 아예 컬럼 기본값으로 함수를 지정하는 방법이 있지 않을까 싶은데 나중에 한번 찾아봐야할듯.

출처 : http://blog.naver.com/yoonhok_524?Redirect=Log&logNo=60170357042