1초단위로  5초동안  실시간 모니터링하기 

  => top -b -d 1  -n 5 -u userid 



* 비정상종료상태로 남아있는 프로세스들 죽이기

top -b -n 1 -u gisys | grep 'T ' | awk '{print $1}' | xargs kill -9


***멀티cpu 사용량 직접 구하기

/proc/stat 첫줄에 있는 user, low priority, system, idle jiffies 값을 가지고 구한다고 하더군요.

(idle jiffies * 100 / user + low priority + system + idle jiffies




~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


아래 출처 : http://www.mimul.com/pebble/default/2012/06/26/1340680991596.html

*** 3번 vmstat를 주로 활용

일반적인 커맨드들을 활용 방법들

1. top을보고 상위에 붙어있는 프로세스를 확인하면서 CPU나 I/O의 어느 문제인지 판별
- 프로세스의 Fullpath를 알고 싶으면 'c'를 누름.
- 개별 CPU의 성능 정보를 볼려면 '1'을 누름.
- 정렬은 'shift'+ 'm'에서 메모리 정렬, 'shift'+ 'o'로 정렬 필드를 선택할 수 있음.
- 'k' 로 프로세스를 kill 시킬 수 있음.
- top -u %UserName% 사용자 계정 단위로 프로세스 확인 가능.

2. ps로 프로세스의 상태를 확인 (T), (D)상태에서 CPU나 I/O의 어느 문제인지 판별
- ps -e -o pid,args --forest : 프로세스의 트리를 보여줌.
- ps -f -u k2,mysql : 사용자 계정별로 프로세스 정보 확인.
- ps -f --ppid 9576 : pid나 ppid로 프로세스 조회.
- ps -p 1,28641 -o pid,etime= : 프로세스 구동 후 경과 시간 정보 확인.
- ps -C java -L -o pid,tid,pcpu,state,nlwp,args : 프로세스의 쓰레드 정보 조회.
- ps aux --sort pmem : 메모리 정보 조회해서 메모리 많이 차지하는 프로세스는 'ps ev --pid=28641'로 해서 개별 프로세스를 감시할 수 있음.

3. vmstat에서 procs의 r, b의 수, swap의 si, so 상태, I/O의 bi, bo 상태, cpu에서 us, sy, id 상태를 확인
- vmstat의 r이 cpu 수 이상이면 실행 프로세스 큐가 cpu를 기다리고있는 상태.
- b가 0보다 크다면 I / O 대기로 인터럽트가 금지되는 프로세스 수가있다는 것.
- memory에서 swpd가 0보다 크다면 스왑을 사용 중이며 메모리 부족.
- bi, bo이 많을 경우 블록 전송이 빈발하고 있음.
- vmstat 명령어 결과에 시간 표시하기 : vmstat 1 5 | timestamp.pl
$ vi timestamp.pl
#!/usr/bin/perl
while (<>) { print localtime() . ": $_"; }

- vmstat -m : slab 정보 표시.
- vmstat -s : 전체 통계 정보 요약.
- vmstat -d : 디스크 통계 정보 조회.
- vmstat -p sdb1 : 디스크 파티션 정보 조회.

4. sar를 사용하여 os 상태 추가 확인
- sar -W 1 5 에서 pswpin/s pswpout/s 0보다 클 경우 스왑 발생하고 있어서 메모리 부족.
- sar 1 5 CPU 정보
- sar -q 1 5 : 평균 부하 및 작업 실행 큐에 대한 정보.
- sar -r 1 5 : 메모리 정보.
- sar -u -P ALL 1 5 : 프로세 서당 CPU 사용률에 대한 정보.
- sar -b 1 5 : I/O 통계 정보 조회.
- sar -d 1 5 : Block Device I/O 통계 조회.
- sar -w 1 5 : 초당 context switch 정보 조회.
- sar -n DEV 1 5 : 네트워크 통계 조회.

5. iostat을 사용해서 디스크 I/O 정보 확인
- iostat -c : Cpu 정보 조회.
- iostat -d : Disk I/O 정보 조회.
- iostat -n : 네트워크 정보 조회.
- iostat -p sda : 디바이스별 I/O 통계.
- iostat -x sda1 : 상세 Disk I/O 정보 조회.



################################################

### mysql monitoring #################

dstat을 활용한 방법들

1. 유용한 dstat 커맨드들
- dstat -Tclmdrn : 전체 정보 조회.
- dstat -Tclm : 메모리 정보 조회.
- dstat -Tclr : CPU 정보 조회
- dstat -Tclnd : 네트워크 정보 조회.
- dstat -Tcldr : 디스크 정보 조회.
- dstat --top-cpu --top-cputime : CPU 부하가 크고 전체 높은 CPU 타임을 가진 프로세스 조회.
- dstat --top-cpu-adv : CPU 부하가 큰 프로세스 상세 정보 조회.
- dstat --top-io --top-bio : 가장 IO를 많이 발생하는 프로세스 조회.
- dstat --top-io-adv --top-bio-adv : 가장 IO를 많이 발생하는 프로세스 상세 정보 조회.
- dstat --cpu --sys --disk --net 1 5 : CPU, SYSTEM, DISK, NETWORK 정보 조회.
- dstat -tal --top-io --top-cpu --top-mem : 전체 정보 조회.

2. dstat으로 MySQL 모니터링
MySQL을 모니터링 하려면 Python의 MySQLdb 라이브러리가 설치되어 있어야 한다.
$ export DSTAT_MYSQL_USER=user
$ export DSTAT_MYSQL_PWD=pwd
$ export DSTAT_MYSQL_HOST=localhost
$ dstat -T --mysql5-cmds --mysql5-conn --mysql5-io --mysql5-keys
--epoch--- ------mysql5-cmds------ mysql5-co -mysql5-io- ---mysql5-key-status----
  epoch   | sel   ins   upd   del |ThCo %Con| recv  sent|used read writ rreq wreq
1330500331|    0     0     0     0|0.00 0.00|0.02  0.11 |  0    0    0    0    0 
1330500332|    8     0     0     0|4.00 1.60|9796B 59.8k|  0    0    0    0    0 
1330500333|    8     0     0     0|4.00 1.60|9.90k 61.1k|  0    0    0    0    0 
1330500334|    8     0     0     0|4.00 1.60|10.2k 62.5k|  0    0    0    0    0 

3. dstat으로 MySQL Innodb 모니터링
$ export DSTAT_MYSQL='-uuser -ppwd -hlocalhost'
$ dstat -T --innodb-io --innodb-buffer --innodb-ops
--epoch--- innodb-io-o innodb-pool ---innodb-ops--
  epoch   |rea wri syn|crt rea wri|ins upd del rea
1330500814|  0   0   0|0.2 1.0  11|  0   0   0   0
1330500815|  0   0   0|3.0 1.0 139|  0   0   0   0
1330500816|  0   0   0|3.0 5.0 172|  0   0   0   0
1330500817|  0   0   0|5.0 5.0 133|  0   0   0   0
출처 http://blog.daum.net/techtip/12414558

'Embedded Lab > linux, x86' 카테고리의 다른 글

[특수문자표]  (0) 2013.11.04
[GFS(Google File System)]  (0) 2013.10.28
[커널스택]  (0) 2013.08.13
[커널 예전 버전 받기]  (0) 2013.08.06
[grub 배경화면 변경]  (0) 2013.08.04
Posted by cyj4369
,

[const 키워드]

Development/C/C++ 2013. 10. 22. 17:02

1. const 키워드
const 키워드는 다들 아시다시피 변수 선언시 자료형 앞뒤에 사용되어 상수로 선언한다.
  const 사용방법은 다음과 같으며 모두 동일하게 동작한다. 
1) const 자료형 변수명  =  초기값
      ex) const float PI = 3.1415;

2) 자료형 const 변수명  =  초기값
      ex) float const PI = 3.1415;

3) const 변수명  =  초기값
      ex) const TWIN = 2;

위의 코드는 모두 동일하게 동작한다. 그런데 자료형에 앞과 뒤에 붙는 const 키워드는 무슨 차이가 있을까?
다음에서 한번 살펴보자.


2. 포인터와 const 키워드
우선 const 키워드가 변수 앞에 붙는 경우를 살펴보자.
int a = 10;
int b = 20;
const int* p = &a;
위 문장을 살펴보면 p는 정수형 포인터(int *)이다. 정수형 (int) 앞에 const 가 붙었으므로 p는 정수 중에서도 상수만을 가리키게 된다. 따라서, p는 상수만을 가리키는 정수형 포인터라는 의미이다. 따라서 *p = 20과 같이 가리키는 대상의 값을 변경할 수 없다. 왜냐하면, 앞서 말한대로 가리키는 대상이 상수를 의미하기 때문이다. 
*p = 20;   // (에러)
p = &b;   // (정상) 포인터가 다른 대상을 가리킬 수 있다.

다음은 const가 변수 뒤에 붙는 경우를 살펴보자.
int a = 10;
int b = 20;
int* const p = &a;
p앞에 const 가 붙어 있으므로 우선 p는 상수이다. 그리고 자료형으로 (int*)가 쓰였으므로 정수형 포인터이다. 다시 말해 p는 정수형 변수를 가리키는 포인터 상수가 된다. 따라서 p = &b와 같이 다른 값을 가리킬 수 없다. 왜냐하면 p 자체가 상수이기 때문에 p의 값을 변경 할 수 없다. 

의미는 서로 조금 차이가 있지만 const는 자료형의 어디에 붙어도 동일한 기능을 수행한다. 하지만 관습적으로 const 를 문장 앞에 놓는것을 선호하기 때문에 자료형의 앞에 놓는 것이 좋다. 프로그램은 나 혼자 개발하는 것이 아니라 모두가 함께 개발하는 것이기 때문이다. 

'Development > C/C++' 카테고리의 다른 글

[코드에서 endian을 파악하는 방법]  (0) 2014.01.06
[C 올림 구현]  (0) 2013.12.01
[가장 간단한 이진수 출력]  (0) 2013.10.17
[2차원 배열 파라미터 전달]  (0) 2013.04.26
[배열을 null로 초기화]  (0) 2013.04.14
Posted by cyj4369
,

#include<stdio.h>


void main()

{

  int i=7,num;

  printf("정수를 입력하세요 : ");

  scanf("%d", &num) ;


  for ( i ; i >= 0 ; i--)

  {

    printf("%d", ( num >> i ) & 1 );

  }

  printf("\n");

}


'Development > C/C++' 카테고리의 다른 글

[C 올림 구현]  (0) 2013.12.01
[const 키워드]  (0) 2013.10.22
[2차원 배열 파라미터 전달]  (0) 2013.04.26
[배열을 null로 초기화]  (0) 2013.04.14
[문자열 함수]  (0) 2013.04.12
Posted by cyj4369
,

최근에 Linux Understanding Kernel 이란 책을 일부분 봤는데 어느 정보 아는 부분이라 지나가다 적어봅니다. 모든 설명은 80x86 아키텍처를 기준으로 합니다.

 

1. 커널 스택은 프로세스마다 하나씩 생성됩니다.
일반적인 프로세스는 User Mode 스택과 Kernel Mode 스택을 각각 하나씩 가지고 있습니다.
User Mode에서 Kernel Mode로의 전환은 시스템호출이나 인터럽트가 발생하면 일어납니다.
즉, esp 레지스터는 프로세스가 User Mode이면 User Mode 스택의 top을 가르키다가
Kernel Mode로 전환이 되면 Kernel Mode 스택의 top을 가르킵니다.

 

2. Kernel Mode 스택은 적어도 다음 두가지 목적으로 사용됩니다. 다른 사용처는 딱히 생각나지 않네요.
가. Kernel Mode로 전환된 프로세스는 언젠간 다시 User Mode로 되돌아가야 합니다.
따라서 User Mode로 전환하기위해 필요한 정보 중 일부를 저장합니다. (일부는 다른 곳에 저장합니다.)
나. Kernel Mode에서 함수를 호출하게 되면 그 함수의 지역변수는 Kernel Mode 스택에서 할당됩니다. (User Mode에서 함수를 호출하면 지역변수가 User Mode 스택에 할당되는 것과 같습니다.)
참고로 80x86 아키텍처에서 커널 스택으로 할당된 공간의 크기는 8KB로 고정되어있습니다. 프로세스 생성때 한번 할당되어 작아지지도 커지지도 않습니다. 따라서 커널에 있는 함수에서는 지역변수를 많이 할당하거나 재귀 함수 호출을 하면 좋지 않습니다.

 

3. 어떻게 설명드려야할 지 상당히 난해한 질문이군요.
커널은 주소 공간 3~4GB를 사용합니다. Kernel Mode 스택은 Kernel Mode에서만 사용되므로 커널 주소 공간에서 할당됩니다.
즉, User Mode 스택을 가르키는 esp 값을 읽어보면 0GB~3GB 사이의 값을 가지고 Kernel Mode 스택을 가르키는 esp 값을 읽어보면 3~4GB 사이의 값을 가지게 됩니다.

 

4. 기타

가. 프로세스의 User Address Space는 프로세스마다 각각 다르지만, Kernel Address Space는 모든 프로세스가 동일하게 봅니다. 즉, 프로세스 A와 프로세스 B의 특정 가상주소 (예를 들면 0xa0001000) 은 서로 다른 물리주소로 맵핑될 수 있습니다. 하지만 특정 커널 공간 주소 (예를 들면 0xc0001000) 는 모든 프로세스에서 동일한 물리주소로 맵핑됩니다.
이를 위해서 커널은 kernel master page table (swapper_pg_dir 변수가 가르킴)을 관리하고, 필요할 때마다 특정 엔트리를 kernel master page table에서 해당 프로세스의 page table에 복사를 합니다 -- 이런 작업은 Kernel Mode에서 페이지 폴트가 발생했을 때 페이지 폴트 핸들러가 수행합니다.

 

나. 시스템호출, 인터럽트 핸들러, 커널 모듈 등은 임의의 프로세스의 context를 이용합니다. 예를 들어, 프로세스 A가 User Mode에서 수행되고 있을 때 timer interrupt가 발생하는 경우 Kernel Mode로 전환하여 timer interrupt service routine을 수행하게 되는데 이때 프로세스 A의 page table과 Kernel Mode 스택을 빌어 쓰게됩니다.
Timer interrupt와 프로세스 A와는 별다른 연관이 없지만 interrupt 발생시점에 프로세스 A가 CPU를 점유하고 있었기 때문에 부하가 큰 context switch 등을 따로 하지 않고 프로세스 A의 context를 그대로 이용하는 것입니다. 다만 커널 모듈 등이 기능의 일부를 따로 커널 쓰레드를 생성하여 구현한 경우라면 그 커널 쓰레드의 context를 사용하겠죠.

'Embedded Lab > linux, x86' 카테고리의 다른 글

[GFS(Google File System)]  (0) 2013.10.28
[top 명령어]  (0) 2013.10.23
[커널 예전 버전 받기]  (0) 2013.08.06
[grub 배경화면 변경]  (0) 2013.08.04
[리눅스에서 itoa는 사용 불가]  (0) 2013.04.14
Posted by cyj4369
,

Linux kernel 을 보고 있는데, 책 마다 base kernel version 이 조금씩 달라서 source code 가 많이 차이가 나더군요.

Understanding Linux Kernel : 2.6.11 version

Professional Linux Kernel Architecture : 2.6.24 version

The Linux Kernel Archives 에서 kernel source code download 할 수 있는데, 2.6.11 이나 2.6.24 와 같이 아주 예전(?) version 의 경우에는 바로 보이지 않아서 
어떻게  download 하는지 몰랐었습니다.

혹시 저같은 분을 위하여 link 적어봅니다. :) 
http://www.kernel.org/pub/linux/kernel/ 에 각 버전별로 압축되서 올라와 있으므로 원하시는 버전 찾으셔서 download 하실 수 있습니다.

http://www.kernel.org/pub/linux/kernel/v2.6/

2.6.11 source (Understanding Linux Kernel base code)

2.6.24 source (Professional Linux Kernel Architecture base code)

 

http://www.kernel.org/pub/linux/kernel/ // 2.6 이전 버전도 directory 선택하여 download 가능.

'Embedded Lab > linux, x86' 카테고리의 다른 글

[top 명령어]  (0) 2013.10.23
[커널스택]  (0) 2013.08.13
[grub 배경화면 변경]  (0) 2013.08.04
[리눅스에서 itoa는 사용 불가]  (0) 2013.04.14
[gz 또는 bz2 압축하기/풀기]  (0) 2013.04.13
Posted by cyj4369
,

grub2_1.png
grub2_1.png [ 749.84 KiB | 5133 번 봄 ] 

우분투 10.4부터는 Grub2 배경화면 설치가 좀더 쉬워졌습니다.
어차피 이전 팁과 거의 같지만 가급적 쉽고 빠르게 다시 정리했습니다.

우선 배경으로 이용할 사진을 준비합니다.

터미널에서 sudo apt-get install grub2-splashimages 를 입력하면 Grub2용 배경그림이
/usr/share/images/grub에 설치됩니다.
이것을 이용하셔도 되고 개인적으로 좋아하는 그림이 있으시면 아무거나 사용가능합니다.

그림은 png, tga 포멧이어야 하며 해상도는 640x480, 800x600, 1024x768정도가 적당합니다.
1280x1024도 가능하지만 폰트가 작게 보여서 불편합니다.

개인 사진을 넣고 싶으시다면 gimp를 이용해서 크기를 맞추고 png포멧으로 저장해 주면 됩니다.
예제로 800x600 해상도의 첨부파일 Oak_800.png를 이용해 보겠습니다.

배경그림이 결정되었다면 그림 파일을 /boot/grub 디렉토리로 옮겨줍니다.
(그림 파일을 꼭 옮길 필요는 없지만 한 곳에 모아 두어야 관리가 편합니다.)
옭길 때 관리자 모드여야 하기 때문에 Alt + F2 누르고 gksu nautilus를 실행하면 편하실 겁니다.


지금부터는 Grub2 설정입니다.

Grub2가 되면서 기존의 menu.lst 설정 파일이 사라지고 대신 여러개의 파일로 나누어졌습니다.
간략히 설명드리자면 다음 2개의 파일을 수정하고 마지막에 sudo update-grub을 실행해 주면 됩니다.


    /etc/default/grub
    /etc/grub.d/05_debian_theme


우선 Alt + F2를 누르고 gksu gedit /etc/default/grub을 입력합니다.


    # If you change this file, run 'update-grub' afterwards to update
    # /boot/grub/grub.cfg.

    GRUB_DEFAULT=0
    #GRUB_HIDDEN_TIMEOUT=0
    GRUB_HIDDEN_TIMEOUT_QUIET=true
    GRUB_TIMEOUT=5
    GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
    GRUB_CMDLINE_LINUX=""

    # Uncomment to disable graphical terminal (grub-pc only)
    #GRUB_TERMINAL=console

    # The resolution used on graphical terminal
    # note that you can use only modes which your graphic card supports via VBE
    # you can see them in real GRUB with the command `vbeinfo'
    GRUB_GFXMODE=800x600


관리자 모드로 파일이 열리면 붉은색 부분을 수정해 줍니다.

GRUB_DEFAULT은 기본으로 선택할 항목을 설정하는 것으로 제일 위 부분이 0부터 시작합니다.
    => MS Windows와 멀티부팅을 하고 자주 Windows로 부팅한다면 이부분을 수정해 줍니다.
GRUB_TIMEOUT=5는 5초후에 자동으로 선택 항목으로 부팅한다는 말입니다.
GRUB_GFXMODE=800x600은 배경그림의 해상도를 설정하는 부분입니다.
    => grub2-splashimages를 이용하시는 분들은 640x480으로 설정하면 됩니다.

설정이 끝나면 저장한 다음 다시 Alt + F2를 누르고 gksu gedit /etc/grub.d/05_debian_theme 을 입력합니다.


    #!/bin/bash -e

    source /usr/lib/grub/grub-mkconfig_lib

    # this allows desktop-base to override our settings
    f=/usr/share/desktop-base/grub_background.sh
    if test -e ${f} ; then
    source ${f}
    else
    WALLPAPER="/boot/grub/Oak_800.png"
    COLOR_NORMAL="white/black"
    COLOR_HIGHLIGHT="blue/white"
    fi


파일이 열리고 위와 같은 스크립트가 나타나는데 10번 째 줄 붉은색 부분이 배경으로 쓰일 파일이름입니다.
기존의 moreblue-orbit-grub을 지우고 원하는 그림 파일의 경로를 정확히 적어 넣으시면 됩니다.

11번째 줄 COLOR_NORMAL은 메뉴폰트의 전경색/배경색이고 다음 줄 COLOR_HIGHLIGHT는 선택항목의 전경색/배경색입니다.
단 배경색이 black일 경우는 투명으로 나타나니 유의해 주시고 아래표를 참고해서 색깔은 선택해 주면 됩니다.

Attachment:
grub2_2.png
grub2_2.png [ 16.23 KiB | 5133 번 봄 ] 

메뉴폰트의 배경색은 black(투명)으로 설정하고 배경그림이 밝은 경우 전경색을 어둡게하고 배경그림이 어두우면
전경색을 밝게 하는 것이 눈에 잘 띄고 보기 좋습니다.

설정이 모두 끝나면 파일을 저장하고 나옵니다.

다시 터미널을 열고 sudo update-grub 을 입력해 Grub2 설정을 시스템에 적용합니다.
그러면 /boot/grub/grub.cfg 파일이 새로 생성되는데 부팅시 Grub2가 이 파일을 직접 읽어들입니다.

만약 Grub 메뉴의 위아래 순서를 바꾸고 싶다면 Alt+F2 누르고 gksu gedit /boot/grub/grub.cfg 한 후 
menuentry 'ubuntu ... ... ' { ... ... ... } 부위를 잘라내고 윈하는 위치에 붙여넣기 해 주면 됩니다. 

설정이 모두 끝났으니 이제 다시 재부팅합니다.
멋진 Grub이 보이세요 !

테마의 통일감을 주기 위해 바탕화면 배경그림을 줄여서 Grub 배경으로 사용해도 좋습니다.
마지막으로 Oak의 원본 이미지에 링크 겁니다. 데스크탑 배경으로 괸찮습니다.


'Embedded Lab > linux, x86' 카테고리의 다른 글

[커널스택]  (0) 2013.08.13
[커널 예전 버전 받기]  (0) 2013.08.06
[리눅스에서 itoa는 사용 불가]  (0) 2013.04.14
[gz 또는 bz2 압축하기/풀기]  (0) 2013.04.13
[blktrace 포맷을 disksim 포맷으로]  (0) 2013.04.08
Posted by cyj4369
,

요즘 FTL에 대한 연구를 하고 있는데 그동안 연구되었던 FTL의 기술 발전 흐름을 정리해 보았습니다. 


  • NAND flash의 단점과 FTL의 등장

    NAND flash는 비 휘발성 메모리 저장장치로 사용하기에 적합하다. 그 이유는 용량대비 가격이 저렴하기 때문이고, 대용량 device를 만들기 용이하기 때문이다. 하지만, NAND flash는 태생적인 단점이 몇 가지 있다.

    • Byte 단위의 접근을 허용하지 않는다. Page단위의 Read/Write 만 가능하다. (XIP 불가능)
    • 덮어쓰기가 되지 않는다. Write를 하기 위해서는 Erase후 program해야 한다.
    • Program과 Erase의 단위가 다르다. Program 하는 단위보다 Erase하는 단위가 월등히 크다
    • Program/Erase 할 수 있는 횟수(P/E cycle)가 무한하지 않다.

       

    이러한 문제 때문에 H/W적으로는 NAND interface protocol 이 S/W적으로는 FTL (Flash Translation Layer)이 필요하게 되었다. FTL 논문을 중심으로 FTL기술이 어떻게 발전해 왔는지 알아보기로 한다.

       

       

  • BAST (2002)

    NAND에서 덮어쓰기 동작을 구현하는 가장 간단한 방법은 쓰기 동작시 마다 해당 page가 속한 Block을 통째로 지우고 다시 쓰는 방법을 사용하는 것이다. 하지만, 이 방법은 한 Block내에 속한 page가 update될 때마다 erase되어야 하고 나머지 page들을 copy해 주어야 하기 때문에 성능면이나 NAND의 수명 측면에서 문제가 되었다. 그래서 등장한 것이 Mapping이라는 개념이고 Write cache(log block)라는 개념이다.

       

    031810_0437_FTL1.png

    BAST 는 log block이라는 cache block을 할당하여 write operation을 수행하는 방법을 사용하였다. Log block은 1:1로 연관되는 Data block이 있으며, 해당 Block에 속한 page들을 write한다. In place order로 program해야 하는 Data block과 달리 Log Block은 Out of place order로 write하고 page map을 관리하는 방법을 사용하였다. Log block은 Data block에 비해 매우 작은 숫자이기 때문에 비어 있는 free block이 필요하면 이전에 사용된 Log block의 데이터를 Data block으로 전송하고 erase하는 방법을 사용하였다. 이를 Merge, Migration, Compaction 또는 Garbage collection이라고 한다.

    파일시스템의 write 패턴에 따라 log block이 data block으로 migration되는 방법이 다르다.

    031810_0437_FTL2.png

    유효한 데이터가 Data block과 Log block에 모두 있는 경우에는 Free block에 data block과 Log block에 있는 데이터를 copy한 뒤 Data block과 log block을 erase하여 Free block으로 만든다.(Full merge) 이 때는 2번의 erase, 1Block copy가 발생한다. 유효한 데이터가 Log block에만 있는 경우 Free block에 Log block의 내용을 copy하고 Log block을 erase한다.(Partial merge) 이 때는 1번의 erase와 1 block copy가 일어난다. 마지막으로 log block의 내용이 모두 유효하면서 in place order로 적혔을 때이다. 이 경우는 Log block을 그대로 Data block으로 mapping만 바꿔주면 된다. 이 때는 erase한번만 일어난다.

    Free block을 얻는 목적은 같은데, 시나리오에 따라서 merge하는 비용은 다른 것을 알 수 있다.

    BAST 는 적용이 간단하고 Sequential data의 비중이 많은 응용에서는 높은 성능을 발휘할 수 있어, card나 USB스토리지에서 널리 사용되었다. 하지만, random 패턴에서는 낮은 성능이 문제가 되었다. 또한, page와 Block의 크기가 커지면서 Switch merge의 비중이 줄고 Full merge가 늘면서 복잡한 응용에서의 FTL로는 부족한 점이 많았다.

    하지만, 적은 리소스로 큰 용량의 NAND를 관리할 수 있다는 점과, 초창기 NAND의 한계를 극복할 수 있다는 가능성을 제시한 의미있는 논문이다.

       

  • FAST, Superblock (2006)

    BAST이후 이 분야에 대한 연구도 활발해 졌다. FAST와 Superblock은 BAST를 기본으로 하면서 BAST 의 단점인 Full merge의 비율을 줄이는데 초점을 두었다.

    031810_0437_FTL3.png

    BAST-위 그림의 (a)의 특징은 Update(log) block과 Data block이 1:1로 대응된다는 점이다. 만약 파일시스템의 Write 패턴이 random이면서 그 범위가 다양하다면(여러 Block boundary를 넘나든다면) I/O의 크기에 비해 많은 수의 log block이 필요로 하게 된다. 이는 log block이 다 차기도 전에 migration하는 결과를 가져와 빈번한 merge로 인해 성능효율성이나 write한 용량대비 많은 erase횟수 유발하게 된다. 게다가 이 때 merge는 full merge나 partial merge이 된다.

       

    FAST는 Update block과 Data block 의 연관 관계를 1:1 에서 1:N으로 확장하여 한 Update block에 여러 Data block이 연관 될 수 있게 하였다. 이렇게 되면 한 Update block에 여러 data block의 data를 담을 수 있어 넓은 범위의 random write가 발생하는 경우 BAST 보다는 Update block에 최대한 많은 양의 data를 write할 수 있었다.(공간 이용도가 높아진다). 하지만, N이 커지면 커질 수록 Migration하는 비용이 커지고, mapping 데이터 양이 커지는 단점이 있다. 즉, migration하는 횟수는 줄었지만, 반대로 비용은 커진 것이다.

       

    Superblock 은 FAST의 연장선에서, FAST의 1:N을 유지하면서도 인접한 Data block을 Group으로 묶어 Superblock이라 칭하고 Superblock내에서는 out of place로 관리하여 Migration 비용을 줄이고자 하였다. 장점은 BAST에 비해 Update block의 활용이 많고, superblock내에서는 out of place로 관리하기 때문에 partial merge를 switch merge로 대신할 수 있다는 장점이 있다. 하지만, superblock도 merge를 해야 하기 때문에 full merge시 비용이 큰 단점이 있다. 또한, out of place map을 유지하는 비용도 추가로 필요하다.

       

  • SAST (2007)

    BAST 와 FAST 는 각각 장.단점이 있다. BAST 는 메모리사용량이 적은 반면, random 패턴의 write시 log block활용도가 낮아 잦은 merge가 일어나고, FAST는 Disk 공간 사용도가 높은 반면 garbage collection의 비용이 큰 단점이 있다. 이를 적절하게 조절할 수 있는 N:N+K mapping 알고리즘이 제안되었다.

    031810_0437_FTL4.png

    SAST 는 Log block과 Log block에 연관되는 Data block의 개수를 조절하여 log block의 공간 활용도를 높이면서 log block에 연관되는 data block의 개수를 제한하여 merge 비용을 줄이려고 하였다.

       

  • LAST (2009)

    Data의 write 패턴은 Random 과 Sequential, Hot과 Cold로 구분 할 수 있다. 이러한 패턴을 고려한 mapping방법이 제안되었다.

    031810_0437_FTL5.png

       

    LAST는 기본적으로 FAST를 계승하는 알고리즘이다. Random과 Sequential을 구별하여 Log block을 할당하였고, Random log block중에서도 Hot과 Cold를 구별하였다. LAST 는 Random 패턴을 구별하기 위해 Write 요청 단위(4KB)를 사용하였다. Hot과 Cold는 최초 write요청은 cold로 지정하고 같은 주소의 요청이 반복되면 hot으로 변경한다. hot random write를 따로 관리하기 때문에 merge 횟수를 줄일 수 있다.

       

  • A-SAST, KAST (2009)

    SAST 이후 이 알고리즘들을 보완하거나 FAST, Superblock의 장점을 융합, 발전시키는 알고리즘들이 등장하였다.

    A-SAST는 기본적으로 SAST의 N:K mapping방법을 사용하지만, N과 K를 runtime시 변경할 수 없었던 SAST 를 개량하여 write 패턴에 따라 동적으로 변경하는 방법을 사용하였다.

    031810_0437_FTL6.png

    A-SAST 는 Log block의 공간 활용도가 떨어질 때는, log block과 연관된 Data block을 늘려 공간활용도를 높이고, 반면 log block의 공간 활용도가 증가하면 log block과 data block의 개수를 줄여 merge 횟 수와 비용을 동시에 줄이는 방법을 제안하였다.

    KAST는 FAST를 바탕으로 하되, 하나의 Log block에 N개의 Data block이 연관되었던 것을 최대 K 개로 제한하였다.

    031810_0437_FTL7.png

    또한, Random log block(RLB)과 Sequential log block(SLB)을 구분하여 data의 패턴에 따라 상호 변환이 가능하게 하였다.

    031810_0437_FTL8.png

    조건에 따라 RLB 를 확장하거나 SLB로 전환하는 방법이 제안되었다. 이 방법의 특징은 data padding을 사용하여 RLB를 SLB로 전환하는 알고리즘이다. Log block에서 대부분 in place order로 write될 수 있는 건인데 조금 틀어진 경우도 swap merge를 유도 할 수 있다.

       

  • 결론

    FTL은 BAST 를 시작으로 KAST에 이르기 까지 서로의 장.단점을 계승 보완하여 발전하였다.FTL이 발전되온 과정을 살펴보면 "Merge 횟수 및 비용 최소화"라는 공통적인 목표를 발견할 수 있다. 이 목표는 성능 뿐 아니라 NAND의 수명에도 영향을 미치기 때문에 중요한 요소이다. Merge 횟수와 비용을 줄이려는 노력은 아래와 같은 방법으로 구체화 되었다.

       

    • Log block의 공간 활용도 증대
    • Write 패턴에 최적화된 Log block 운용 (Random / Sequential, Hot / Cold)
    • Log block와 Data block의 연관 관계 다변화 (1:N, N:K)
    • Block mapping 바탕의 부분적인 Page mapping 운용

       

    SSD의 등장으로 고비용 고사양 device의 시대가 열렸다. 또한, NAND의 Block 및 page의 크기가 계속해서 증가할 것이므로 Block mapping에는 한계가 있다. 따라서 Block mapping의 일부분을 Page mapping으로 보완하려는 시도가 좀 더 발전 할 것으로 예상된다.

    또한, 평균 merge비용 뿐 아니라 순간 최고 merge 비용에 대한 연구, NAND의 공정이 미세화 될 수록 점점 특성이 나빠지는 현상을 고려한 연구도 필요할 것으로 생각된다.

'Embedded Lab > FLASH MEMORY' 카테고리의 다른 글

[NAND 플래시의 종류]  (0) 2012.10.17
[SSD에서 FTL 관리 기법 - BPLRU]  (0) 2012.09.09
[SSD 개론]  (0) 2012.09.06
Posted by cyj4369
,




2011-2012년 ODM SSD 시장 점유율 삼성전자 1위, 인텔과 도시바 하락

전송 2013-05-30 12:33





  태그(Tag)  : SSD



SSD 시장은 빠르게 성장 중이며 컴퓨터를 더욱 얇고 가볍게 만들어주고 있을 뿐만 아니라 마그네틱 디스크 대신 메모리 칩을 이용한 고속과 저전력의 장점을 소비자에게 제공한다.

 

이처럼 빠른 성장과 판매가 꾸준히 증가하고 있는 SSD 시장은 앞으로도 큰 성장이 이루어질 것으로 알려진 가운데 최근 메모리 관련 신기술 시장 조사기관으로 알려진 Forward Insights는 2011년과 2012년 ODM 시장 점유율을 공개했다.

 

ODM (Original Design Manufacturing, 생산자 개발방식, 주문자 상표가 부착되며 제작자가 제품 개발/ 생산에 책임을 지고 만드는 방식, ODM 업체는 설계와 제조 기술력을 갖추고 있으며 독자 브랜드 기업처럼 연구 및 개발, 기술을 축적한다. 다만 기술력이 있으나 글로벌 시장에서 마케팅 비용이 부담되어 주문자 상표로 판매)

 

SSD 시장 점유율 2011-2012 (ODM)

구분

2011년

2012년

변화

삼성전자 (SAMSUNG)

44%

48%

9%

도시바 (Toshiba)

32%

21%

-34%

샌디스크 (Sandisk)

3%

9%

300%

인텔 (Intel)

14%

8%

-43%

라이트온 (Liteon)

1%

5%

500%

마이크론 (Micron)

4%

5%

25%

A-DATA

2%

3%

50%

기타

0%

1%

-

 

Forward Insights에 따르면 2011년과 2012년 ODM 시장 점유율은 삼성전자가 2011년 44%에서 2012년 9%가 성장하며 48%의 점유율로 1위를 차지했다. 삼성전자는 전체 ODM SSD 시장에서 절반에 가까운 시장 점유율을 차지했다.

 

인텔과 도시바 (Toshiba)는 다른 기업의 성장속에 시장 점유율이 가장 크게 하락했다. 인텔은 2012년 거의 절반에 가까운 시장 점유율을 잃어 8% 점유, 도시바는 34%가 하락하며 21%의 시장 점유율을 기록했다. 라이트온 (Liteon)과 샌디스크 (Sandisk)는 가장 큰 성장을 이루었으며 라이트온은 500%가 성장해 전체 5% 점유, 샌디스크는 전체 9% 시장을 점유했다.

 

마이크론과 A-DATA가 5%와 3%로 뒤를 이었으며 나머지 기업도 시장 점유율이 증가했다. 마이크론은 인텔과 낸드 플래시 조인트 벤처인 IMFT를 통해 시장 점유율이 증가했다.

 

이번 조사 결과는 ODM SSD 제조사를 기준으로 정리된 결과로 잘 알려진 커세어 (Corsair), OCZ, 킹스톤 (Kingston), 플렉스터 (Plextor) 등의 SSD 제조사는 포함되지 않았다.

 

한편 Forward Insights는 SSD 시장 수익은 지난 2012년 45%가 증가한 29억달러를 형성했다고 전했다.


Posted by cyj4369
,
패러럴즈에 채팅으로 문의했다.
다중 모니터 환경에서 윈도우 실행시 동시실행 모드가 되지 않는 문제가 있었다.
안되는 영어로 문의하느라 고생했다..

1. 
In the 'View' menu for Parallels Desktop check the 'Use All Displaysin Full Screen' option; 
2. Switch the virtual machine into Fullscreen view mode; 
3. Go to Start → Control Panel; 
4. Go to Display Settings → Adjust Resolution (on the left pane); 
5. Click the additional monitors one-by-one, and in the drop-downmenu in the center of the window, select "Extend Windows desktop tothis display" for each of the monitors. 
6. Exit from Fullscreen view mode; 
7. Try to enter Coherence again.


'Device > Mac' 카테고리의 다른 글

[BetterTouchTool]  (0) 2013.05.10
[맥 배경화면 스크린샷 위치]  (0) 2013.04.27
[사파리 커스터마이징]  (0) 2012.10.06
[맥OS 사용자 계정 이름 변경]  (0) 2012.09.04
[알아두면 유용한 단축키]  (0) 2012.05.27
Posted by cyj4369
,

[BetterTouchTool]

Device/Mac 2013. 5. 10. 15:44

작업하다보면 프로그램간 전환을 매우 빈번하게 하여야 한다. 기본적으로 있는 미션컨트롤(스페이시스+익스포제)는 가끔 둘러보면서 전환할 때 유리하고, Command+Tab은 두 개의 프로그램을 오고갈 때에 유리하다. 어디 구석에 박혀있는 프로그램이나 파일을 찾을 때에는 Spotlight를 쓰면 된다.

이 포스팅에서 언급하고자하는 것은 일종의 런처이다. 런처에는 여러가지가 있고 퀵실버라는 유명한 놈도 있는데(이놈은 너무 유명해서 괜히 쓰기싫은 놈이라 제외하고), 여기에서는 아직 마이너 버전만 있는 BetterTouchTool에 대해서 쓰기로 한다. 왜냐면 내가 아주 잘 쓰고 있기 때문이다. 만약 기존에 쓰던 런처가 있다면 해당 런처에서 단축키를 지정하는 기능이 있는지 알아보고 거기에서 설청하는 것이 더 이로울 것이다. BetterTouchToll은 아직 앱스토어에 업기 때문에 직접 다운로드(http://blog.boastr.net)를 받으면 된다.

실행을 하면 상단에 터치패드에 손가락을 대고 있는 모양의 아이콘이 생긴다. Preferences...로 들어가서 단축키들을 설정해주기로 한다.



< 상단 메뉴에 아이콘이 추가 되어 있다. 설정으로 들어간다 >


환경설정 창을 열면 아래와 같이 열린다. 기능은 확실히 많은데, 아래에 보이다시피 인터페이스가 직관적이지는 않다. 특히 순서가 조금 헷갈린다. 아래와 같은 순서대로 하면 된다.

  1. 아래 번호대로 Keyboard탭으로 간 이후에..
  2. Add new keyboard shortcut을 누른다.
  3. 위 리스트에 빈줄이 추가되는데, Keyboard Shortcut 부분에 원하는 단축키를 배정한다.
  4. 해당 키가 눌러졌을 때에 실행할 액션을 지정한다. 

액션으로 할 수 있는 기능들은 진짜 많다. 내가 주로 쓰는 것은 프로그램 실행/전환, 자주쓰는 폴더 열기이다.


< BetterTouchTool로 할 수 있는 액션 중 일부 >


보통 맥에서 Option키 조합은 많이 비워져 있으므로, 프로그램을 'Option + 숫자키'로 배정을 한다. 가장 많이 쓰는 크롬의 경우에는 Option+1이고, 많이 쓰는 텍스트편집기를 Option+2로 배치하고.. 파인더는 Option+`, Vmware는 Option+4 등으로 쓴다. 실제로 작업을 할 때에는 왼손만으로 곧바로 원하는 프로그램으로 바로바로 전환을 한다. 오히려 작업별로 스페이스를 분리하면 이동시에 데스크탑 스크롤 효과만 나므로, 한 스페이스에 모두 다 몰아넣고 단축키를 바꾸어가면서 한다. 작업 전환이 거의 생각과 동시에 이루어진다.


※ BetterTouchTool에는 키보드 단축키이 외에도, 터치 제스처를 단축키도 등록할 수 있다. 또한 각 프로그램마다 할 수 있어서, 파인더에서 좌우로 쓸기를 뒤로가기/앞으로가기로 등록할 수도 있다. 각자 취향에 맞추어 쓰면 된다.

Posted by cyj4369
,