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
,