멀티프로그래밍 위키로 바로가기 → http://www.devnote.net/wiki
MS-SQL로 만든 DB에서 UniqueIdentifier 칼럼을 만들어 Index를 설정하거나 이를 Primary key로 사용하면, 말 그대로 GUID 즉, 쉽게 글로벌 유일성(Global Uniqueness)를 보장해 주게 됩니다. DB에서 UniqueIdentifier 즉 UUID 혹은 GUID를 인덱스로 사용하느냐 아니면 int, bigint, number 등의 정수형을 사용하느냐에는 따른 많은 장단점이 있습니다.

GUID 값은 이른바 Pseudo Random 값으로, 16 bytes 크기로 상당히 큰 싸이즈이며, index를 크게 단편화(fragmentation)시킬 수 있다는 단점이 있습니다. 아래 블로그에서 보듯이 Windows 7 RC 다운로드 싸이트가 다운된 원인이 클라이언트에서 제공하는 GUID 값을 SQL DB 인텍스로 사용한데 기인한 것이라고 합니다. 이것은 결국 SQL의 성능을 급격히 저하시켜 웹페이지를 매우 느리게 만들었다는 것 입니다.


http://www.sqlskills.com/BLOGS/PAUL/post/Why-did-the-Windows-7-RC-failure-happen.aspx

SQL 2005에서 추가된 NEWSEQUENTIALID() 는 상당히 fragmentation을 줄여주는 것으로 나타나 있습니다. NEWSEQUENTIALID()는 내부적으로 UuidCreateSequential Windows API를 사용하는데 이는 컴퓨터 MAC 주소를 가지고 있어, 여전히 유일성을 보장해주고 있습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
SQL

아래 마이크로소프트사의 KB를 보면 2의 배수가 아닌 멀티코어 CPU에서는 SQL 서버 2005를 설치할 수가 없다고 합니다. 최근에 AMD를 시작으로 3-Core, 6-Core 등이 발표되고 있는 시점에서 문제가 발견되었다고 생각되는군요.

http://support.microsoft.com/kb/954835

SQL 버그라고 웃어 넘길려고 하다가 잠시, 내가 짠 코드에도 비슷한 문제는 없는지 다시 보게 되었습니다. 또, CPU 개수가 2의 배수라고 가정하고 개발된 프로그램들이 아마도 또 있을 것이라는 추측을 하게 됩니다. 같은맥락에서 32비트 unsigned int 값을 가지고 비트연산하여 각각의 비트를 하나의 CPU로 연관지어 프로그램하는 예는 흔히 있는 일 입니다. 이경우 32개 이상의 CPU지원은 불가능하게 됩니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

C++ Volatile 에 관해 아주 잘 정리된 문서를 아래에 발견하였습니다.

http://blogs.msdn.com/ericeil/archive/2007/10/26/fun-programming-problem-a-simple-lock-free-algorithm.aspx
크리에이티브 커먼즈 라이센스
Creative Commons License

Windows 7 XP Mode

기타 2009/05/06 03:14
이른바 가상화 (Virtualization) 기술은 이미 Windows에 적용되어 사용되고 있습니다. VMware가 선두주자이며 Microsoft는 Hyper-V를 서버 2008부터 채용하고 있는데, 특히 최근에 이들 두 회사는 기본적인 Virualization 소프트웨어를 무료로 공급하기 시작했습니다.

제 경우에는 Virtual PC 2007을 사용하여 가상 Windows XP를 Vista 컴퓨터에서 사용하고 있습니다. 가상화 기술로 VM (Virtual Machine)을 만들었을 때 장점은 여러 가지가 있습니다만, 제 경우는

1. 여러 가지 OS (언어별 버전별)의 호환성 테스트에 매우 유용합니다. 미리 만들어진 VM 디스크 이미지를 이용 쉽게 여러 OS를 하나의 컴퓨터에서 실행할 수 있습니다. 이 디스크 이미지는 하드웨어에 종속되지 않아 다른 컴퓨터로 복사 실행이 자유롭습니다.

2. 호스트 OS를 변경하지 않고 프로그램을 설치/제거 할 수 있다는 점. 가장 대표적인 예로는 인터넷 뱅킹을 위해 IE에 여러 개의 ActiveX 모듈을 설치해야만 하는 경우, 저는 XP VM을 실행하여 이 곳에서만 인터넷 뱅킹을 합니다. 초기 Virtual Disk 이미지를 백업해 놓으면 언제든지 아무런 프로그램도 설치되지 않은 깨끗한 상태의 Windows XP로 부터 다시 시작할 수 있습니다. 더 나아가 Virtual Disk 이미지를 암호화시키면 (TrueCrypt 등의 유틸리티 사용) 이곳에 저장된 데이터도 안전하게 보관할 수 있습니다.

3.오래되어 사용하지 않는 컴퓨터에 있던 Windows XP 라이센스를 다시 사용할 수 있습니다.

최근 Windows 7의 XP모드는 다름 아닌 Virtual PC를 탑재한 것 입니다. 이러한 방법으로 비스타에 이슈가 되었던 호환성 문제를 피하겠다는 것이지요. (XP 호환성 100% 지원은 이미 포기하였기 때문이기도 합니다.)

CPU나 메모리를 상당히 많이 사용하는 어플리케이션이나 고화질의 3D그래픽을 사용하는 게임을 제외하고는 VM에서 아무런 문제가 없이 실행됩니다.

이 가상화 기술은 서버 분야에서도 매우 유용합니다. 강력한 멀티코어 CPU가 보편화되어가는 요즘, 여려 개의 VM을 하나의 서버에 설치함으로써 하나의 컴퓨터를 마치 여러 대의 컴퓨터처럼 사용할수 있는 것 입니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

제 책장에도 유명한 알고리즘 책 중의 하나인 Introduction to Algorithms 의 첫번째 에디션이 아직 꽂혀 있습니다. 대학원 다닐 때 구입한 것인데, 부분 부분 참고로 읽었던 기억이 납니다.

이 책의 3번째 에디션에 "Multithreaded Algorithm" 챕터가 추가된 모양인데, 아래 링크에서 샘플로 다운로드 받아 볼 수가 있습니다. 좋은 셀프 스터디 자료가 되지 않을까 생각합니다.

http://www.cilk.com/resources/multithreaded-algorithms-textbook-chapter/
크리에이티브 커먼즈 라이센스
Creative Commons License

학창시절 운영체제(OS) 시간에 쓰레드 퀀텀 (quantum) 혹은 시분할 (time slice)에 관해 배운 적이 있습니다. 최근 우연히 팀 프로그래머 중 한 명이 윈도우즈 서버에서 퀀텀의 크기가 상당히 크다는 것을 다시 상기시켜 주었습니다.

Windows Internals 책에 따르면 윈도우즈 XP의 경우는 6, 윈도우즈 서버의 경우는 36의 퀀텀 값을 갖는다고 합니다. (3 퀀텀이 1 클럭에 해당함)

보통 인텔의 멀티프로세서 시스템은 1 클럭 간격이 15ms 이므로, XP는 30ms, 서버는 180ms의 시간이 (한 번의 쓰레드 스케줄링으로)  하나의 쓰레드에 할당되는 것 입니다.
 물론 쓰레드가 대기(wait)상태로 들어간다면, 이 퀀텀을 다 사용하지 못하고 context switch가 일어 날 수 있습니다.

이러한 퀀텀 값은 또한 윈도우즈의 Performance Option 에서 변경 가능 합니다. (Application = 6 퀀텀 혹은 Background Service = 36 퀀텀 둘 중 선택 가능)

원도우즈 서버가 180 ms라는 상당히 큰 퀀텀 값을 가지는 이유는 서비스 어플리케이션 쓰레드에게 작업을 수행할 충분한 시간을 주기 위함입니다. 또 잦은 context switch는 전체 성능을 저하시킬 수 있기 때문입니다. 하지만 XP와 같은 Client OS의 경우 사용자에게 빠른 응답을 하는 것이 중요하므로 (예를 들면 UI 쓰레드) 작은 퀀텀 값을 갖는 것입니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

Mark Russinovich가 최근에 발표한 VMMap은 놀라울 정도로 자세하게 프로세스의 가상메모리와 물리메모리 사용 상태를 빠르고 보기 쉽게 보여줍니다. 그 전에는 디버거를 사용하여 분석해야만 했던 것을 보기 쉽게 색깔별 종류별로 UI에 표시해 주는데 정말 유용한 메모리 분석 툴이라고 생각됩니다.

특히, 서버프로그램의 경우 가상/물리 메모리 사용량 뿐만 아니라 Free 메모리 리스트를 확인하므로써 얼마나 메모리가 단편화 (fragmentation)되어 있는지 쉽게 알 수있습니다. (아주 오랫동안 실행 중인 서버프로그램은 메모리 단편화로 결국 언젠가 재시작해야만 합니다)
크리에이티브 커먼즈 라이센스
Creative Commons License

최근 개인적으로 D-Link DNS-321 NAS (Network Attached Storage)를 구입하였습니다. 이 NAS는 2개의 HDD를 넣을 수 있으며 RAID 0/1을 지원하며 가격도 상당히 저렴한 편입니다. 최근 리베이트를 하고 있어 $30정도를 되돌려 받으면 약 $100 정도의 가격입니다. 여기에 WD 1TB SATA를 구입하여 일단 설치하였습니다. 하나의 HDD bay는 아직 비어있는데, 추후 구매할 예정입니다. 물론 1TB의 용량이 모자라서는 아니고 reliability를 높이기 위해 RAID나 주기적 백업용으로 사용하려고 합니다.

약 3년 전만 해도 테라바이트급 하드디스크를 개인이 구입해서 가정용으로 사용한다는 것은 상상하기 어려웠습니다. 그동안 USB하드에 저장했던 가족 사진과 비디오 파일들을 몽땅 옮겼지만 아직 20GB정도 채웠을 뿐입니다. 지금까지 구입했던 CD도 전부 파일로 만들어 iTune 서버로 올릴 계획입니다.

이 D-Link DNS 321를 사게된 것은 이것이 Linux가 설치된 컴퓨터이고 커스터마이즈가 매우 쉽다라는 점 때문입니다. 기본적으로 제공되는 기능으로 SMB, UPnP 서버 기능을 갖추고 있으며, 아주 손쉽게 추가로 Linux 프로그램을 설치할 수 있습니다. 특히 이 싸이트에 있는 정보를 보고 나서 감탄하지 않을 수 없었습니다. (DNS 321은 DNS 323의 새로운 버전으로 가격이 좀 싼 대신 몇 가지 기능이 제외되었습니다)

이미 fun_plug, FireFly (iTune server), MediaTomb (UPnP server)를 설치하였고, gcc는 물론 각종 Linux 유틸리티도 설치하였습니다. 오랜만에 telnet으로 접속해 Unix 계열 프로그램을 사용해보니 대학 다닐 때 처음 VAX 메인프레임사용하다가, Sun Workstation에서 프로그래밍 하던 기억이 나는 군요.

전송속도는 무선(802.11g) 으로 약 2MB/sec로 좀 느리고 유선(100M)으로 약 7-8MB/sec정도 속도가 나옵니다. 유선으로 접속시 CPU 사용량을 보니 90%이상 Samba 서버가 차지하고 있더군요. 이 NAS는 Marvell 400 MHz CPU를 사용하고 있어서 아무래도 더 이상의 성능은 기대하기 힘들듯 합니다.

제 집에는 PS3와 Xbox가 네트웍으로 연결되어 있어, NAS에 있는 사진, 동영상, 음악을 바로 플레이할 수 있게되었습니다. 단지 TV가 아직도 10년전에 구입한 브라운관 TV라서 좀 답답합니다. 이제 LCD HDTV를 사야할 때가 된 것이 아닌가 싶습니다만, 조금만 더 기다리면 가격이 더 떨어지지 않을까 기대해 봅니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
NAS

메모리와 디스크 지연시간을 실생활에 비유한 글을 올렸습니다. 오늘은 최근 급속도로 개발되고 있는 Solid State Disk (SSD)를 사용하는 경우를 생각해 보겠습니다.

삼성은 최근 256GB SSD를 이미 양산하기 시작했고. Dell에서 판매하는 노트북 컴퓨터에 이미 옵션으로 선택할 수 있습니다. 놀라운 것은 $300만 추가하면 500GB HDD에서 256GB SSD로 업그레이드가 가능하다는 것입니다. 애당초 초기 가격이 $1000정도 할 것이라는 예상을 뒤없고, 삼성은 시장 선점을 노려 Dell에 낮은 가격으로 납품을 시작한 것이 아닌가하는 추측을 낳게 합니다.

SSD와 관련된 상세한 벤치마크 데이터를 별로 찾을 수 없었으나 SanDisk사에서 발표한 프리젠테이션 에 따르면 latency는 약 0.10 ms에 불과 한 것으로 나와 있습니다. HDD는 원반 디스크가 회전하는 기계 장치로, 데이터를 읽기 전에 헤드를 움직이고 디스크를 회전시켜 원하는 위치로 움직이여야만 하는 seek time이라는 것이 존재합니다만, SSD는 이런 것이 없습니다. 게다가 HDD는 충격과 소음에 약해 쉽게 고장나고 내구성이 매우 떨어지고 전력소모량도 SSD에 비해 큽니다.

SSD를 추가한 latency 비유는 아래와 같습니다.(평균 latency를 0.10 ms라 가정한 것입니다.). 앞으로 4, 5년 이후 SSD가 서버분야 특히 데이터베이스 분야에도 엄청난 변화와 속도 향상을 가져올 것으로 보이는데, 여기에 삼성이 선두로 나가려 하고 있다는 점에서 자랑스럽기도 합니다.


메모리와 디스크 latency를 실생활에 비유한다면 다음과 같다.

1. L1 cache: 책상 위에서 종이 한 장을 잡기 (3초)

2. L2 cache: 책장에서 책 한 권을 꺼내기 (14초)

3. 메인 메모리: 복도로 걸어 나가 자판기에서 커피 한 잔을 뽑기 (4분)

4. 하드디스크: 건물을 나와서 1년 3개월 동안 세계일주 하기.

4. SSD: 3박 4일동안 국내 여행 떠나기.
크리에이티브 커먼즈 라이센스
Creative Commons License

.NET을 사용한 "managed code"로 프로그래밍을 하는 경우, 무조건 한 쓰레드 당 1MB의 스택 메모리를 사용합니다. 제가 전에 쓴 이 포스팅도 참고하기 바랍니다.

다른 예를 들어보면 만약 .NET을 사용하여 서버를 제작할 때 하나의 클라이언트에 하나의 스레드를 할당하게 된다면, 1024명의 동접 사용자가 있을 경우 이미 스택 메모리를 위해서만 1GB 메모리가 사용된다는 것 입니다.

또, 쓰레드를 많이 생성시켜 병렬처리를 하는 예에서도 이러한 Managed 쓰레드의  메모리 사용이 걸림돌이 됩니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

◀ PREV : [1] : [2] : [3] : [4] : [5] : ... [9] : NEXT ▶