반응형
반응형
sar 명령어를 이용한 시스템 모니터링

#설치환경

- CentOS 5.x x64bit (CentOS 6.x 환경도 동일 합니다)


1. sar 명령어란?

- sar 명령어는 솔라리스,유닉스,리눅스 등에서 유용하게 쓰는 시스템 모니터링 프로그램이다.

- 모니터링 대상이 상당히 넓은 편이며 기본값은 CPU 활동에 대한 통계를 출력한다.

- 각종 활동에 대한 통계를 다른프로그램을 이용하여 파일로 저장하고 통계치를 리포팅 하는 기능을 제공한다.

- sadc에서 생성한 daily activity 파일을 읽어서 보고서를 작성하기도 하고 시스템의 활동 상황을 수집 할 수도 있다.



2. sar 명령어로 모니터링 가능한 항목

- I/O 전송량
- 페이징
- 프로세스 생성 숫자
- 블락 디바이스 활동
- 인터럽트
- 네트워크 통계
- run 큐 및 시스템 부하 평균
- 메모리와 스왑 공간 활용 통계
- 메모리 통계
- CPU 이용도
- 특정 프로세스에 대한 CPU 이용도
- inode, 파일, 기타 커널 테이블에 대한 상태
- 시스템 스위칭 활동(context switch)
- 스와핑 통계
- 특정 프로세스 통계
- 특정 프로세스의 자식 프로세스 통계
- TTY 디바이스 활동



3. sar 패키지 설치

- sysstat 패키지가 설치되어 있는지 먼저 확인 해 봅니다

[root@localhost ~]# rpm -qa | grep sysstat



- 패키지가 설치되어 있지 않을 경우 아래 명령어로 설치 합니다.

[root@localhost ~]# yum install sysstat

Loaded plugins: fastestmirror
Setting up Remove Process
Resolving Dependencies
--> Running transaction check
---> Package sysstat.i386 0:7.0.2-3.el5_5.1 set to be erased
--> Finished Dependency ResolutionDependencies Resolved

========================================================================
Package Arch Version Repository Size

Removing:
sysstat i386 7.0.2-3.el5_5.1 installed 383 k

Transaction Summary
=========================================================================

Install 0 Package(s) 
Update 0 Package(s) 
Remove 1 Package(s)

Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Erasing : sysstat 1/1

Removed:
sysstat.i386 0:7.0.2-3.el5_5.1

Complete!

[root@localhost ~]#



- 패키지 설치 후 sar 명령어를 바로 실행하면 아래와 같은 에러 메시지가 나게 됩니다.

- 이는 정상으로, sar 패키지는 10분 간격으로 데이터를 수집하기 때문에 설치 직후 데이터가 없어서 나오는 에러입니다.

[root@localhost /dev]# sar 
-bash: /usr/bin/sar: No such file or directory



4. sar 명령어 활용하기

- 기본정보 보기. 기본적으로 sar 명령어를 입력하였을 경우 보여지는 값은 CPU사용 정보입니다.

[root@localhost ]# sar
Linux 2.6.18-308.1.1.el5 (localhost) 01/03/2013

12:00:01 AM CPU %user %nice %system %iowait %steal %idle
12:10:01 AM all 0.07 0.00 0.12 0.01 0.00 99.80
12:20:01 AM all 0.06 0.00 0.08 0.00 0.00 99.85
12:30:01 AM all 0.03 0.00 0.00 0.00 0.00 99.97
12:40:01 AM all 0.03 0.00 0.01 0.00 0.00 99.97
12:50:01 AM all 0.03 0.00 0.01 0.00 0.00 99.95
01:00:01 AM all 0.03 0.00 0.00 0.00 0.00 99.97
01:10:01 AM all 0.03 0.00 0.01 0.00 0.00 99.96

.

.

.


03:40:01 PM all 0.04 0.00 0.04 0.00 0.00 99.92
03:50:01 PM all 0.05 0.00 0.07 0.01 0.00 99.87
04:00:01 PM all 0.05 0.00 0.07 0.01 0.00 99.87
04:10:01 PM all 0.05 0.00 0.08 0.01 0.00 99.87
04:20:01 PM all 0.05 0.00 0.07 0.01 0.00 99.87
04:30:01 PM all 0.05 0.00 0.07 0.01 0.00 99.87
04:40:01 PM all 0.05 0.00 0.07 0.01 0.00 99.87
04:50:01 PM all 0.05 0.00 0.08 0.01 0.00 99.87
05:00:01 PM all 0.05 0.00 0.07 0.01 0.00 99.87
05:10:01 PM all 0.05 0.00 0.07 0.01 0.00 99.87
Average: all 0.04 0.00 0.02 0.00 0.00 99.95

[root@localhost ]#

* %user : user mode 에서 작동한 CPU 가동률
* %sys : kernel mode에서 작동한 CPU 가동률
* %idle : idle 상태로 있었던 CPU 대기율
* %iowait : io wait 상태로 있었던 CPU 대기율



- 실시간 정보 보기

. sar [간격] [인터벌] 형식으로 입력합니다. 3초간격으로 10개의 데이터 값을 출력 해 줍니다.

[root@localhost ]# sar 3 10
Linux 2.6.18-308.1.1.el5 (localhost) 01/03/2013

05:30:30 PM CPU %user %nice %system %iowait %steal %idle
05:30:33 PM all 0.04 0.00 0.08 0.00 0.00 99.88
05:30:36 PM all 0.00 0.00 0.04 0.00 0.00 99.96
05:30:39 PM all 0.17 0.00 0.12 0.00 0.00 99.71
05:30:42 PM all 0.00 0.00 0.08 0.00 0.00 99.92
05:30:45 PM all 0.04 0.00 0.04 0.00 0.00 99.92
05:30:48 PM all 0.00 0.00 0.00 0.00 0.00 100.00
05:30:51 PM all 0.04 0.00 0.12 0.04 0.00 99.79
05:30:54 PM all 0.00 0.00 0.08 0.00 0.00 99.92
05:30:57 PM all 0.04 0.00 0.04 0.00 0.00 99.92
05:31:00 PM all 0.08 0.00 0.00 0.00 0.00 99.92
Average: all 0.04 0.00 0.06 0.00 0.00 99.89

[root@localhost ]#



- 버퍼의 액티비티 측정. I/O와 transfer의 통계를 백분율로 출력합니다.

[root@localhost ]# sar -b
Linux 2.6.18-308.1.1.el5 (localhost) 01/03/2013

12:00:01 AM tps rtps wtps bread/s bwrtn/s
12:10:01 AM 13.37 0.00 13.37 0.00 364.55
12:20:01 AM 6.74 0.00 6.74 0.00 212.55
12:30:01 AM 1.33 0.00 1.33 0.00 23.10
12:40:01 AM 1.32 0.00 1.32 0.00 22.78
12:50:01 AM 1.62 0.00 1.62 0.00 42.19

.

.

04:40:01 PM 10.13 0.00 10.13 0.00 241.91
04:50:01 PM 10.55 0.00 10.54 0.03 247.47
05:00:01 PM 10.73 0.00 10.73 0.00 252.55
05:10:01 PM 10.88 0.00 10.88 0.00 255.02
05:20:01 PM 10.44 0.00 10.44 0.00 246.23
05:30:01 PM 9.78 0.00 9.78 0.00 233.15
Average: 2.35 0.00 2.35 0.00 53.96

[root@localhost ]#

* tps : 디스크에서 발생되어진 초당 전송량. 즉 디스크에 요청한 I/O양.
* rtps : 디스크로부터 발생된 초당 읽기 총 요청 횟수
* bread/s : 드라이브 안의 블럭에서 초당 읽은 데이터의 총합.
* bwrtn/s : 드라이브 안의 블럭에서 초당 쓰여진 데이터의 총합.



- 페이징 통계를 출력합니다.

[root@localhost ]# sar -B
Linux 2.6.18-308.1.1.el5 (localhost) 01/03/2013

12:00:01 AM pgpgin/s pgpgout/s fault/s majflt/s
12:10:01 AM 0.00 91.14 476.48 0.00
12:20:01 AM 0.00 53.14 335.81 0.00
12:30:01 AM 0.00 5.77 16.33 0.00
12:40:01 AM 0.00 5.69 16.40 0.00
12:50:01 AM 0.00 10.55 55.39 0.00
01:00:01 AM 0.00 3.93 14.25 0.00
01:10:01 AM 0.00 4.60 18.94 0.00

.

.

04:40:01 PM 0.00 60.48 252.60 0.00
04:50:01 PM 0.01 61.87 270.12 0.00
05:00:01 PM 0.00 63.14 261.50 0.00
05:10:01 PM 0.00 63.76 268.29 0.00
05:20:01 PM 0.00 61.56 267.27 0.00
05:30:01 PM 0.00 58.29 247.77 0.00
05:40:01 PM 0.00 57.33 244.90 0.00
Average: 0.00 13.90 60.67 0.00

[root@localhost ]#

* pgpgin/s : 디스크로부터 초당 paged in 된 page의 총 수
* pgpgout/s : 디스크로부터 초당 paged out 된 page의 총 수



- 새롭게 생성된 프로세스 수를 출력합니다.

[root@localhost ]# sar -c
Linux 2.6.18-308.1.1.el5 (localhost) 01/03/2013

12:00:01 AM proc/s
12:10:01 AM 0.73
12:20:01 AM 0.51
12:30:01 AM 0.03
12:40:01 AM 0.04
12:50:01 AM 0.09

.

.

04:40:01 PM 0.39
04:50:01 PM 0.44
05:00:01 PM 0.39
05:10:01 PM 0.43
05:20:01 PM 0.44
05:30:01 PM 0.38
05:40:01 PM 0.38
Average: 0.10

[root@localhost ]#



- 지정한 시간까지의 정보만 출력합니다.

[root@localhost ]# sar -e 03:00:00
Linux 2.6.18-308.1.1.el5 (localhost) 01/03/2013

12:00:01 AM CPU %user %nice %system %iowait %steal %idle
12:10:01 AM all 0.07 0.00 0.12 0.01 0.00 99.80
12:20:01 AM all 0.06 0.00 0.08 0.00 0.00 99.85
12:30:01 AM all 0.03 0.00 0.00 0.00 0.00 99.97
12:40:01 AM all 0.03 0.00 0.01 0.00 0.00 99.97
12:50:01 AM all 0.03 0.00 0.01 0.00 0.00 99.95
01:00:01 AM all 0.03 0.00 0.00 0.00 0.00 99.97
01:10:01 AM all 0.03 0.00 0.01 0.00 0.00 99.96
01:20:01 AM all 0.03 0.00 0.00 0.00 0.00 99.97
01:30:01 AM all 0.03 0.00 0.00 0.00 0.00 99.97
01:40:01 AM all 0.03 0.00 0.00 0.00 0.00 99.97
01:50:01 AM all 0.03 0.00 0.00 0.00 0.00 99.97
02:00:01 AM all 0.03 0.00 0.00 0.00 0.00 99.97
02:10:01 AM all 0.03 0.00 0.01 0.00 0.00 99.97
02:20:01 AM all 0.03 0.00 0.00 0.00 0.00 99.97
02:30:01 AM all 0.03 0.00 0.00 0.00 0.00 99.97
02:40:01 AM all 0.03 0.00 0.00 0.00 0.00 99.97
02:50:01 AM all 0.03 0.00 0.00 0.00 0.00 99.97
Average: all 0.03 0.00 0.02 0.00 0.00 99.95

[root@localhost ]#



- 특정 날짜의 sar 정보를 출력합니다. sar -f /var/spool/sa26 (26일자 sar 정보를 출력합니다)

[root@localhost ]# sar -f /var/spool/sa/sa26
Linux 2.6.18-308.1.1.el5 (localhost) 12/26/2012

12:00:01 AM CPU %user %nice %system %iowait %steal %idle
12:10:01 AM all 0.03 0.00 0.01 0.00 0.00 99.97
12:20:01 AM all 0.03 0.00 0.00 0.00 0.00 99.97
12:30:01 AM all 0.03 0.00 0.00 0.00 0.00 99.97
12:40:01 AM all 0.03 0.00 0.00 0.00 0.00 99.97
12:50:01 AM all 0.03 0.00 0.00 0.00 0.00 99.97

.

.

11:10:01 PM all 0.03 0.00 0.01 0.00 0.00 99.96
11:20:01 PM all 0.03 0.00 0.00 0.00 0.00 99.97
11:30:01 PM all 0.03 0.00 0.00 0.00 0.00 99.97
11:40:01 PM all 0.03 0.00 0.01 0.00 0.00 99.96
11:50:01 PM all 0.03 0.00 0.00 0.00 0.00 99.97
Average: all 0.03 0.00 0.01 0.00 0.00 99.96

[root@localhost ]#

* sar는 매 10분마다 시스템모니터링 결과를 /var/lgo/sa/saxx 파일에 바이너리 형태로 기록합니다.



- 실행 대기 큐에 있는 프로세스를 보여줍니다. 시스템의 load avarage를 나타냅니다.

[root@localhost ]# sar -q
Linux 2.6.18-308.1.1.el5 (localhost) 01/03/2013

12:00:01 AM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
12:10:01 AM 0 169 0.00 0.00 0.00
12:20:01 AM 0 167 0.00 0.00 0.00
12:30:01 AM 0 167 0.00 0.00 0.00
12:40:01 AM 0 167 0.00 0.00 0.00
12:50:01 AM 0 167 0.00 0.00 0.00
01:00:01 AM 0 167 0.00 0.00 0.00
01:10:01 AM 0 167 0.00 0.00 0.00
01:20:01 AM 0 167 0.00 0.00 0.00

.

.

05:00:01 PM 0 172 0.00 0.00 0.00
05:10:01 PM 0 172 0.04 0.01 0.00
05:20:01 PM 0 172 0.00 0.00 0.00
05:30:01 PM 0 174 0.00 0.00 0.00
05:40:01 PM 0 174 0.03 0.01 0.00
05:50:01 PM 0 174 0.00 0.00 0.00
06:00:01 PM 0 174 0.00 0.00 0.00
Average: 0 169 0.00 0.00 0.00

[root@localhost ]#

* runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 순으로 보여주며 각 프로세스 대기 시간과 전체 프로세스 수,
그리고 1분전, 5분전 평균 작업 부하 정보를 보여 줍니다.



- 메모리, 스왑 공간의 이용 통계를 출력합니다.

[root@localhost ]# sar -r
Linux 2.6.18-308.1.1.el5 (localhost) 01/03/2013

12:00:01 AM kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad
12:10:01 AM 2008372 2015032 50.08 428460 1342904 1959756 164 0.01 140
12:20:01 AM 2009032 2014372 50.07 428460 1343020 1959756 164 0.01 140
12:30:01 AM 2009404 2014000 50.06 428464 1343084 1959756 164 0.01 140
12:40:01 AM 2008784 2014620 50.07 428476 1343128 1959756 164 0.01 140
12:50:01 AM 2009032 2014372 50.07 428476 1343148 1959756 164 0.01 140
01:00:01 AM 2007916 2015488 50.09 428476 1343152 1959756 164 0.01 140
01:10:01 AM 2007800 2015604 50.10 428476 1343160 1959756 164 0.01 140

.

.

05:00:01 PM 2000908 2022496 50.27 428712 1348464 1959756 164 0.01 140
05:10:01 PM 2001900 2021504 50.24 428728 1348716 1959756 164 0.01 140
05:20:01 PM 2001024 2022380 50.27 428748 1348908 1959756 164 0.01 140
05:30:01 PM 2001280 2022124 50.26 428752 1349072 1959756 164 0.01 140
05:40:01 PM 1999536 2023868 50.30 428752 1349228 1959756 164 0.01 140
05:50:01 PM 1999536 2023868 50.30 428752 1349400 1959756 164 0.01 140
06:00:01 PM 1999908 2023496 50.29 428752 1349568 1959756 164 0.01 140
Average: 2006274 2017130 50.13 428562 1344557 1959756 164 0.01 140

[root@localhost ]#

* kbmemfree : 사용가능한 총 메모리의 양(k/bytes)
* kbmemused : 사용중인 총 메모리의 양(k/bytes), 커널에서 사용중인 메모리는 제외
* %memused : 사용된 메모리의 %양
* kbmemshrd : 시스템에서 공유메모리로 사용된 총 메모리의 양(k/bytes)
* kbbuffers : 커널에서 buffer 메모리로 총 사용된 메모리의 양(k/bytes)
* kbcached : 커널에서 cache data로 사용된 총 메모리의 양(k/bytes)
* kbswpfree : 사용가능한 스왑 공간의 양(k/bytes)
* kbswpused : 사용된 스왑 공간의 양(k/bytes)
* %swpused : 사용된 스왑 공간의 %양



- 메모리 통계를 보여줍니다

[root@localhost ]# sar -R
Linux 2.6.18-308.1.1.el5 (localhost) 01/03/2013

12:00:01 AM frmpg/s bufpg/s campg/s
12:10:01 AM 0.05 0.02 0.03
12:20:02 AM -0.20 0.01 0.00
12:30:01 AM 0.10 0.02 0.00
12:40:01 AM -0.05 0.01 0.00
12:50:01 AM 0.00 0.01 0.00

.

.

10:20:01 AM -0.05 0.02 0.00
10:30:01 AM 0.05 0.01 0.00
10:40:01 AM -0.10 0.01 0.00
10:50:01 AM -1.47 0.05 0.24
Average: -1.62 0.66 0.67

[root@localhost ]#

* frmpg/s : 시스템에서 초당 자유로워진 memory pages의 양. 페이지의 크기는 시스템 아키텍쳐에 따라 달라지며 보통 4K,8K이다
* bufpg/s : 시스템에서 초당 buffer에 추가적으로 더해진 memory pages의 양



- 커널테이블 & 파일에서 inode의 상태를 출력합니다

[root@localhost ]# sar -v
Linux 2.6.18-308.1.1.el5 (localhost) 01/03/2013

12:00:01 AM dentunusd file-nr inode-nr pty-nr
12:10:01 AM 10089 4448 13566 1
12:20:02 AM 10089 4448 13566 1
12:30:01 AM 10089 4448 13566 1
12:40:01 AM 10089 4448 13566 1
12:50:01 AM 10089 4448 13566 1

.

.

10:20:01 AM 62914 4480 63754 1
10:30:01 AM 62914 4480 63753 1
10:40:01 AM 62914 4480 63754 1
10:50:01 AM 63029 4640 63850 2
11:00:01 AM 63043 4608 63855 2
Average: 45275 4479 47023 1

[root@localhost ]#

* dentunusd : Directory cache 에서 사용되고있지 않은 cache entries
* file-nr : file handles 의 사용양
* inode-nr : inode handles 의 사용양



- swapping의 통계를 출력합니다.

[root@localhost ]# sar -W
Linux 2.6.18-308.1.1.el5 (localhost) 01/03/2013


12:00:01 AM pswpin/s pswpout/s
12:10:01 AM 0.00 0.00
12:20:02 AM 0.00 0.00
12:30:01 AM 0.00 0.00
12:40:01 AM 0.00 0.00
12:50:01 AM 0.00 0.00

.

.

11:20:01 AM 0.00 0.00
11:30:01 AM 0.00 0.00
11:40:01 AM 0.00 0.00
11:50:01 AM 0.00 0.00
12:00:01 PM 0.00 0.00
12:10:01 PM 0.00 0.00
Average: 0.00 0.00

[root@localhost ]#

* pswpin/s : 초당 swap in 된 수

* pswout/s : 초당 swap out 된 수



반응형

'연구개발 > Linux' 카테고리의 다른 글

vmstat 명령어  (0) 2014.07.08
[ubuntu] system benchmarking tool  (0) 2014.07.07
sar를 이용하여 서버의 현재 부하상태를 알아보기  (0) 2014.07.07
Linux 성능 모니터링  (0) 2014.07.07
netstat  (0) 2014.07.04
반응형

http://theeye.pe.kr/archives/1450

서버가 부하가 가중되면 가장 먼저 알아내야 하는것이 원인을 파악하는 것일 겁니다. 하지만 그러기 어려운 상황이라면 가장 먼저 파악해야 하는것이 CPU에서 오는 부하인지 I/O에서 오는 부하인지를 알아내야 할 것입니다.

우선 기본적으로 부하상태(Load Average)를 알아내기 위해 top, w, uptime의 명령어를 활용할 수 있습니다.

top








w







uptime




top > w > uptime 순으로 보여지는 정보의 양이 적어지는군요. top의 경우에는 실행중인 프로세스의 목록도 표시됩니다. 오늘 언급하려는것은 sar(System Activity Reporter)입니다. 매우 간단하게 부하를 분류하여 보여줍니다.










위의 시스템은 IO대기가 차지하는 비율이 70%에 육박하는 상태입니다. IO문제가 분명하군요. 보통 DB 서버들이 부하가 걸릴때 위와 같은 모습을 보입니다. 이 경우 메모리를 증설하면 디스크에 읽고 써야 하는 데이터를 그만큼 메모리에 올릴 수 있어 디스크의 IO를 현저히 줄일 수 있습니다.









메모리를 8G에서 16G로 증설한 후의 모습입니다. 정말 신기할 정도로 IO가 줄었네요. sar에서 자주 쓰이는 옵션으로는 다음과 같은 것이 있지 않을까 생각합니다.

-u : CPU 사용율 확인
-P : 특정 CPU의 사용율 확인 (sar -P 0)
-q : Load Average 확인
-r : 메모리 사용 현황 확인

sar는 sysstat 패키지에 포함되어있습니다. 다음과 같이 설치 가능합니다.


반응형

'연구개발 > Linux' 카테고리의 다른 글

[ubuntu] system benchmarking tool  (0) 2014.07.07
sar 명령어를 이용한 시스템 모니터링  (0) 2014.07.07
Linux 성능 모니터링  (0) 2014.07.07
netstat  (0) 2014.07.04
[관리] Boot process 관리하기  (0) 2014.07.04
반응형

<주기적으로 갱신 예정>

 

1. 시스템 모니터링

 

sar -x pid interval 총횟수       

---> interval 간격으로 총횟수만큼 특정 pid cpu 사용량 정보 출력

 

top -d interval -n 총회수 -p pid 

---> interval 간격으로 총횟수만큼 특정 pid의 cpu, memory 사용 정보등 출력

 

ltrace -p pid -c

---> pid에 해당하는 프로세스가 사용하는 함수를 통계내준다.

어디에서 부하가 걸리고 있는지 파악할 수 있다. 실행시키고 10초정도 있다가 ctrl+c로 중단하면 통계 내서 출력. -c 옵션을 빼면 계속해서 그냥 출력.

반응형
반응형

netstat -t


항목 중 State의 의미

- LISTEN : 포트가 열려 있는 상태

- SYS_SENT : SYN 요청상태

- SYN_RECEIVED : SYN + ACK 요청 후 ACK를 기다리고 있음.

- ESTABLISHED : tcp 3way handshaking 완료 후 연결 상태

- FIN_WAIT, CLOSE_WAIT, FIN_WAIT2 : 서버 연결 종료 후 클라이언트에게 RST를 보내 커넥션을 정리하는 과정

- CLOSING : 메시지 전송도중 분실

- TIME_WAIT : 연결은 종료되었지만 뒤늦게 도착할 수 있는 세그먼트를 위해 소켓을 열어둔 상태

- CLOSED : 연결 종료


반응형
반응형

시스템이 시작되면, BIOS에서 보통 이동식 drive에 disk가 있는지 확인하고, 없다면, 첫번째 부트 가능한 harddisk의 master boot record (MBR)을 찾는다. 이때, 대부분의 linux system에서 boot process 제어는 boot loader에서 처리된다.


ubuntu를 포함한 대부분의 linux system에서는 Grand Unified Boot Loader (GRUB)가 기본으로 사용된다. GRUB는 LILO를 대체하였다.


일단, boot loader에 의해 linux system이 선택되었다면, boot loader는 kernel을 load한다. 이때, kernel은 hard drive의 root file system을 mount할 필요가 있는데, 이는 적합한 storage driver (block device kernel module)을 요구한다. 이 driver는 hard drive에 위치해 있으며, block device module이 포함된 간단한 initial ramdisk (initrd)가 boot loader에 의해 mount된다. 이것이 root file system을 읽도록 linux kernel을 사용가능하게 해준다. 그 이후, init process는 run level에 따라 system service를 시작한다.


GRUB Boot Loader 사용하기


ubuntu 9.10 이후에 grub는 ext4 파일 시스템 지원등으로 인해 grub2가 사용된다. 그래서 기존에 사용되던 menu.lst(/boot/rub/menu.lst)는 사용되지 않는다. grub 관련 설정은 /etc/default/grub 이고, 해당 파일을 수정하면, sudo update-grub를 실행한다. 해당 파일은 대략 다음과 같다.


# If you change this file, run 'update-grub' afterwards to update

# /boot/grub/grub.cfg.

# For full documentation of the options in this file, see:

#   info -f grub -n 'Simple configuration'

///

GRUB_DEFAULT=0

#GRUB_HIDDEN_TIMEOUT=0

GRUB_HIDDEN_TIMEOUT_QUIET=true

GRUB_TIMEOUT=10

GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

GRUB_CMDLINE_LINUX=""


# Uncomment to enable BadRAM filtering, modify to suit your needs

# This works with Linux (no patch required) and with any kernel that obtains

# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)

#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"


# 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=640x480


# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux

#GRUB_DISABLE_LINUX_UUID=true


# Uncomment to disable generation of recovery mode menu entries

#GRUB_DISABLE_RECOVERY="true"


# Uncomment to get a beep at grub start

#GRUB_INIT_TUNE="480 440 1"


우선, 해당 설정 파일의 문서는 info 명령으로 확인 가능하다.

~$ info -f grub -n 'Simple configuration'


각각의 항목별 의미는 다음과 같은데, A=B로 설정된다. 값에 특수 문자나 공백이 포함된 경우, A="hello, world"와 같이 따옴표로 지정해야 한다. 값이 0인 경우 unset을 의미할 수 있다.


GRUB_DEFAULT

0부터 시작되는 기본으로 고려될 목록 번호. 기본값 0. 

만일 값이 saved, 즉, GRUB_DEFAULT=saved로 되어 있으면, GRUB_SAVEDEFAULT, grub-set-default, 혹은 grub-reboot 값이 참조된다.


GRUB_SAVEDEFAULT

'true'인 경우, 선택된 항목이 다음 사용의 default 항목으로 설정되기 위해 저장된다. GRUB_DEFAULT=saved인 경우 사용된다.


GRUB_TIMEOUT

메뉴 선택까지 timeout 초. 기본값 5. 0인 경우 menu를 보여주기전 선택됨. -1은 무한 대기.


GRUB_HIDDEN_TIMEOUT

메뉴 표시전 키를 누를때 까지 기다릴 시간. 키를 누르게 되면 메뉴가 표시된다. 누르지 않으면 바로 부팅 단계로 진행된다. 기본값 0.


GRUB_HIDDEN_TIMEOUT_QUIET

GRUB_HIDDEN_TIMEOUT과 결합되어 사용된다. 'true'인 경우, 키 입력을 기다리기 위한 count down 정보가 축약된다. 기본값 0.


GRUB_DEFAULT_BUTTON

GRUB_TIMEOUT_BUTTON

GRUB_HIDDEN_TIMEOUT_BUTTON

GRUB_BUTTON_CMOS_ADDRESS

vender를 위한 power button을 위해 마련되었다. _BUTTON을 제외한 부분의 변수와 연결되어 사용된다.


GRUB_DISTRIBUTOR

배포자를 표기한다.


GRUB_TERMINAL_INPUT

terminal input device를 선택한다. 공백으로 여러개 선택 가능하다.

platform의 기본 terminal input을 기본값으로 사용한다.


console : PC BIOS와 EFI console

serial : serial terminal

ofconsole : Open Firmware console

at_keyboard : PC AT keyboard (Coreboot에 유용) 혹은 usb_keyboard : HID Boot Protocol USB keyboard


GRUB_TERMINAL_OUTPUT

terminal output device를 선택한다. 공백으로 여러개 선택 가능하다.

platform의 기본 terminal input을 기본값으로 사용한다.


console : PC BIOS와 EFI console

serial : serial terminal

gfxterm : graphic mode output

ofconsole : Open Firmware console

vga_text : VGA text output (Coreboot에 유용)


GRUB_TERMINAL

만일 set되었다면, GRUB_TERMINAL_INPUT과 GRUB_TERMINAL_OUTPUT 값을 덮어쓴다.


GRUB_SERIAL_COMMAND

serial console 사용시 serial port를 설정하는 명령


GRUB_CMDLINE_LINUX

linux kernel을 위한 menu 항목을 추가하는데 필요한 command line arguments


GRUB_CMDLINE_LINUX_DEFAULT

GRUB_DISABLE_RECOVERY의 값이 true가 아니라면, 두개의 menu 항목이 추가된다. 하나는 기본 항목이고 나머지 하나는 보구 모드 항목이다. GRUB_CMDLINE_LINUX 이후의 기본 메뉴 항목에 추가될 command line arguments를 지정한다.


GRUB_CMDLINE_NETBSD

GRUB_CMDLINE_NETBSD_DEFAULT

GRUB_CMDLINE_LINUX와 GRUB_CMDLINE_LINUX_DEFAULT와 동일하되 linux kernel이 아닌 NetBSD를 위한 값이다.


GRUB_CMDLINE_XEN

GRUB_CMDLINE_XEN_DEFAULT

GRUB_CMDLINE_LINUX와 GRUB_CMDLINE_LINUX_DEFAULT와 동일하되 Linux와 Xen을 위한 값이다.


GRUB_DISABLE_LINUX_UUID

보통 grub-mkconfig는 menu 항목을 universally-unique identifiers (UUID)를 만들어 구별하는데, root=UUID=...와 같은 형태로 구성된다. 이것이 훨씬 더 신뢰가 높지만, 몇몇 경우에는 적합하지 않을 수 있다. 이러한 UUID 기능을 사용하지 않으려면 'true'로 설정한다.


GRUB_DISABLE_RECOVERY

'true'로 설정된다면 복구 menu 항목은 비활성된다.


GRUB_VIDEO_BACKEND

'gfxterm' graphical terminal이 사용되거나 혹은 GRUB_GFXPAYLOAD_LINUX가 설정되어 있기 때문에, graphical video가 요구된다. 그러면 grub-mkconfig는 가능한 GRUB video driver를 load하고 가장 적합한 것을 사용한다. 만일 이러한 이유를 무시하려면 해당 옵션을 설정한다.

grub-install이 실행된후 /boot/grub/video.lst에 가능한 video driver가 들어간다.


GRUB_GFXMODE

'gfxterm' graphical terminal의 해상도를 설정한다. 기본은 'auto'이며, 이는 가장 적합한 해상도를 선택하려고 할 것이다.


GRUB_BACKGROUND

'gfxterm' graphical terminal의 배경 image를 설정한다. .png .tga .jpg .jpeg가 가능하며, 화면 크기에 맞게 늘어난다.


GRUB_THEME

'gfxterm' graphical terminal에 사용할 테마를 선택한다.


GRUB_GFXPAYLOAD_LINUX

'text'로 설정하면 normal text mode로 boot를 진행한다.

'keep'으로 설정하면 GRUB_GFXMODE를 사용한 graphic mode를 유지한다.

'폭x높이'['x깊이']로 설정하면 특정 graphic mode로 동작하며, ',' 나 ';'로 연결하여 여러개를 지정할 수 있다.

graphic card나 다른 이유로 boot 과정에 문제가 있다면, 'text'로 지정하기 바란다.


GRUB_DISABLE_OS_PROBER

'grub-mkconfig'는 'os-prober'를 사용하는데, 다른 OS 설치여부를 확인하고 menu 항목을 추가 생성하는 일을 한다. 이러한 기능을 사용하지 않으려면 'true'로 설정한다.


GRUB_INIT_TUNE

GRUB 시작시 소리를 발생한다. 화면 확인이 어려울때 유용할 수 있다.


GRUB_BADRAM

RAM의 잘못된 영역을 거른다.


이런 grub 설정 파일을 수정하였다면, 다음과 같이 업데이트한다.

~sudo update-grub

Generating grub.cfg ...

Found linux image: /boot/vmlinuz-2.6.38-8-generic

Found initrd image: /boot/initrd.img-2.6.38-8-generic

Found memtest86+ image: /boot/memtest86+.bin

Found Microsoft Windows XP Professional on /dev/sda1

done

~$


Initial ramdisk (initrd) 수정하기


initrd는 /boot에 위치하며, initrd.img-2.6.38-8-generic 형태의 이름을 가지고 있다. 만일 해당 파일이 손상되거나 새로운 block device driver를 추가해야 한다면, mkinitrd 명령을 실행한다. 우선 initrd-tools 설치가 되어야 하며, initrd 파일의 복사가 필요하다.


sudo apt-get install initrd-tools

...

sudo mkinitrd -o /boot/ initrd.img-2.6.38-8-generic

...


새로운 kernel version으로 교체하려면, 아래와 같이 현재 실행되는 kernel version을 사용한다.

sudo mkinitrd -o /boot/initrd.img-`uname -r` `uname -r`


Starrtup과 Run Level 제어하기


run level은 시스템 관리를 위해 서비스 시작시 그 실행을 몇개의 단계로 구분한 것을 말한다.


 Run Level

 이름

 설명

 0

 halt

 시스템 종료. run level을 0으로 변경하면 시스템 종료됨. 

 1

 single user mode

 시스템 복원, 관리자 권한 shell. 파일 시스템 점검 및 암호 변경

 2

 multi user mode(Not NTS)

 네트워크를 사용하지 않는 멀티 유저

 3

 full multi user mode

 일반적인 멀티 유저

 4

 unused

 임의 정의 가능

 5

 X11

 run level 3 + GUI

 6

 reboot

 시스템 재부팅


kernel이 시작되었다면, init process에 system 제어권을 넘긴다. init process는 첫 running process로, PID가 1이다. /etc/inittab 파일에 기반하여 startup process, default run level, 그리고 run level에 맞게 실행될 init script등을 확인한다.

(참고) 최근의 ubuntu에서는 /etc/inittab 파일이 존재하지 않는다. upstart라는 이벤트 기반의 기존의 init 작업들을 대체하고 있다. 자세한건 upstart를 참고하기 바란다.


default run level은 일반적으로 desktop에서는 5, server system에서는 3으로 되어 있다(telinit 명령).


다음과 같이 현재의 run level을 확인할 수 있다.

앞의 N은 이전의 run level이 없다는 뜻이다.

~$ runlevel

N 2

~$


run level 변경은 아래와 같이 한다. (재부팅)

~$ sudo init 6


서비스 제어하기


다음과 같이 service 상태 확인을 할 수 있다.

(생각보단 정확한 수치가 나오지 않는다. 대신 목록을 구할 수 있다.)

~$ service --status-all

 [ ? ]  acpi-support

 [ ? ]  acpid

 [ ? ]  alsa-restore

 [ ? ]  alsa-store

 [ ? ]  anacron

 [ + ]  apparmor

 [ ? ]  apport

 [ ? ]  atd

 [ ? ]  avahi-daemon

 [ ? ]  binfmt-support

 [ - ]  bluetooth

 [ - ]  bootlogd

 [ - ]  brltty

 [ ? ]  console-setup

 [ ? ]  cron

 [ ? ]  cups

 [ ? ]  dbus

 [ ? ]  dmesg

 [ ? ]  dns-clean

 [ ? ]  failsafe-x

 [ ? ]  gdm

 [ - ]  grub-common

 [ ? ]  hostname

 [ ? ]  hwclock

 [ ? ]  hwclock-save

 [ ? ]  irqbalance

 [ - ]  kerneloops

 [ ? ]  killprocs

 [ ? ]  module-init-tools

 [ ? ]  network-interface

 [ ? ]  network-interface-security

 [ ? ]  network-manager

 [ ? ]  networking

 [ ? ]  ondemand

 [ ? ]  pcmciautils

 [ ? ]  plymouth

 [ ? ]  plymouth-log

 [ ? ]  plymouth-splash

 [ ? ]  plymouth-stop

 [ ? ]  plymouth-upstart-bridge

 [ ? ]  pppd-dns

 [ ? ]  procps

 [ + ]  pulseaudio

 [ ? ]  rc.local

 [ - ]  rsync

 [ ? ]  rsyslog

 [ + ]  saned

 [ ? ]  sendsigs

 [ ? ]  setvtrgb

 [ ? ]  speech-dispatcher

 [ ? ]  stop-bootlogd

 [ ? ]  stop-bootlogd-single

 [ ? ]  sudo

 [ - ]  sysstat

 [ ? ]  udev

 [ ? ]  udev-fallback-graphics

 [ ? ]  udev-finish

 [ ? ]  udevmonitor

 [ ? ]  udevtrigger

 [ ? ]  ufw

 [ ? ]  umountfs

 [ ? ]  umountnfs.sh

 [ ? ]  umountroot

 [ ? ]  unattended-upgrades

 [ - ]  urandom

 [ - ]  x11-common

~$


위 서비스들은 아래의 항목과 연관이 있다.

~$ ls /etc/init.d

acpid           hwclock-save                rsyslog

acpi-support    irqbalance                  saned

alsa-restore    kerneloops                  sendsigs

...

halt            README                      x11-common

hostname        reboot

hwclock         rsync

~$


dbus의 서비스 상태를 알아본다.

~$ service dbus status

dbus start/running, process 880

~$

--status-all에서는 [ ? ]로 표기되었지만, 개별 항목으로 질의시 시작되고 있음이 확인된다.


anacron 서비스의 시작, 종료, 재시작은 다음과 같다.

~$ service anacron status

anacron stop/waiting

~$ sudo service anacron start

anacron start/running, process 3939

~$ sudo service anacron restart

anacron start/running, process 3946

~$ sudo service anacron stop

anacron stop/waiting

~$ service anacron status

anacron stop/waiting

~$


kernel 정보


다음과 같이 kernel release 정보를 구한다.

~$ uname -r

2.6.38-8-generic

~$ uname -a

Linux greenfish-virtual-machine 2.6.38-8-generic #42-Ubuntu SMP Mon Apr 11 03:31:50 UTC 2011 i686 i686 i386 GNU/Linux

~$

-a를 이용하여 모든 정보를 확인할 수 있다.


kernel ring buffer를 통한 kernel 로그는 다음과 같이 확인한다.

주로, hardware등 kernel의 에러 로그를 확인하는데 사용된다.

~$ dmesg | less


다음과 같은 로그 내용을 확인한다.

[    0.000000] Initializing cgroup subsys cpuset

[    0.000000] Initializing cgroup subsys cpu

[    0.000000] Linux version 2.6.38-8-generic (buildd@vernadsky) (gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu3) ) #42-Ubuntu SMP Mon Apr 11 03:31:50 UTC 2011 (Ubuntu 2.6.38-8.42-generic 2.6.38.2)

[    0.000000] BIOS-provided physical RAM map:

[    0.000000]  BIOS-e820: 0000000000000000 - 000000000009f800 (usable)

[    0.000000]  BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)

[    0.000000]  BIOS-e820: 00000000000ca000 - 00000000000cc000 (reserved)

[    0.000000]  BIOS-e820: 00000000000dc000 - 0000000000100000 (reserved)

[    0.000000]  BIOS-e820: 0000000000100000 - 000000001fef0000 (usable)

[    0.000000]  BIOS-e820: 000000001fef0000 - 000000001feff000 (ACPI data)

[    0.000000]  BIOS-e820: 000000001feff000 - 000000001ff00000 (ACPI NVS)

[    0.000000]  BIOS-e820: 000000001ff00000 - 0000000020000000 (usable)

[    0.000000]  BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)

[    0.000000]  BIOS-e820: 00000000fec00000 - 00000000fec10000 (reserved)

[    0.000000]  BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)

[    0.000000]  BIOS-e820: 00000000fffe0000 - 0000000100000000 (reserved)

[    0.000000] Notice: NX (Execute Disable) protection cannot be enabled in hardware: non-PAE kernel!

[    0.000000] NX (Execute Disable) protection: approximated by x86 segment limi

:


다음과 같이 직접 읽을 수 있다.

~$ sudo cat /var/log/syslog* | less


다음과 같이 출력된다. (syslog, syslog.0, ... 등의 파일을 순차적으로 출력할 수 있다.)

Jul  3 13:17:06 greenfish-virtual-machine kernel: imklog 4.6.4, log source = /proc/kmsg started.

Jul  3 13:17:06 greenfish-virtual-machine rsyslogd: [origin software="rsyslogd" swVersion="4.6.4" x-pid="751" x-info="http://www.rsyslog.com"] (re)start

Jul  3 13:17:06 greenfish-virtual-machine rsyslogd: rsyslogd's groupid changed to 103

Jul  3 13:17:06 greenfish-virtual-machine rsyslogd: rsyslogd's userid changed to 101

Jul  3 13:17:06 greenfish-virtual-machine rsyslogd-2039: Could no open output pipe '/dev/xconsole' [try http://www.rsyslog.com/e/2039 ]

Jul  3 13:17:06 greenfish-virtual-machine kernel: [    0.000000] Initializing cgroup subsys cpuset

Jul  3 13:17:06 greenfish-virtual-machine kernel: [    0.000000] Initializing cgroup subsys cpu

Jul  3 13:17:06 greenfish-virtual-machine kernel: [    0.000000] Linux version 2.6.38-8-generic (buildd@vernadsky) (gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu3) ) #42-Ubuntu SMP Mon Apr 11 03:31:50 UTC 2011 (Ubuntu 2.6.38-8.42-generic 2.6.38.2)

Jul  3 13:17:06 greenfish-virtual-machine kernel: [    0.000000] BIOS-provided physical RAM map:

Jul  3 13:17:06 greenfish-virtual-machine kernel: [    0.000000]  BIOS-e820: 000

:


다음과 같이 로드된 모듈을 구할 수 있다.

~$ lsmod

Module                  Size  Used by

binfmt_misc            13213  1 

vmhgfs                 53736  0 

vsock                  39001  0 

acpiphp                23425  0 

vesafb                 13449  1 

snd_ens1371            24722  2 

gameport               15027  1 snd_ens1371

snd_ac97_codec        105614  1 snd_ens1371

ac97_bus               12642  1 snd_ac97_codec

snd_pcm                80244  2 snd_ens1371,snd_ac97_codec

snd_seq_midi           13132  0 

snd_rawmidi            25269  2 snd_ens1371,snd_seq_midi

snd_seq_midi_event     14475  1 snd_seq_midi

snd_seq                51291  2 snd_seq_midi,snd_seq_midi_event

snd_timer              28659  2 snd_pcm,snd_seq

snd_seq_device         14110  3 snd_seq_midi,snd_rawmidi,snd_seq

snd                    55295  11 snd_ens1371,snd_ac97_codec,snd_pcm,snd_rawmidi,snd_seq,snd_timer,snd_seq_device

soundcore              12600  1 snd

snd_page_alloc         14073  1 snd_pcm

joydev                 17322  0 

ppdev                  12849  0 

vmci                   59861  2 vmhgfs,vsock

i2c_piix4              13095  0 

parport_pc             32111  1 

shpchp                 32345  0 

vmw_balloon            12729  0 

psmouse                73312  0 

serio_raw              12990  0 

lp                     13349  0 

parport                36746  3 ppdev,parport_pc,lp

usbhid                 41704  0 

hid                    77084  1 usbhid

floppy                 60032  0 

BusLogic               26456  2 

vmxnet                 20715  0 

vmw_pvscsi             18144  0 

vmxnet3                44517  0 

~$


모듈의 정보는 다음과 같이 확인한다.

~$ modinfo snd_pcm

filename:       /lib/modules/2.6.38-8-generic/kernel/sound/core/snd-pcm.ko

license:        GPL

description:    Midlevel PCM code for ALSA.

author:         Jaroslav Kysela <perex@perex.cz>, Abramo Bagnara <abramo@alsa-project.org>

srcversion:     00979A7ED7E0ABD4D1B71CA

depends:        snd,snd-page-alloc,snd-timer

vermagic:       2.6.38-8-generic SMP mod_unload modversions 686 

parm:           preallocate_dma:Preallocate DMA memory when the PCM devices are initialized. (int)

parm:           maximum_substreams:Maximum substreams with preallocated DMA memory. (int)

~$


다음과 같이 로드 가능한 모듈을 구할 수 있다.

~$ modprobe -l

...

misc/vmblock.ko

misc/vsock.ko

misc/vmhgfs.ko

~$ modprobe -l | grep c-qcam

kernel/drivers/media/video/c-qcam.ko

~$


아래와 같이 모듈을 로드한다.

~$ sudo modprobe c-qcam

~$


다음과 같이 로드됨이 확인된다.

~$ lsmod

Module                  Size  Used by

c_qcam                 17825  0 

v4l2_common            16757  1 c_qcam

...


아래와 같이 언로드한다.

~$ sudo modprobe -r c-qcam

~$


언로드가 확인되었다.

~$ lsmod

Module                  Size  Used by

binfmt_misc            13213  1 

vmhgfs                 53736  0 

vsock                  39001  0 

...

~$


Hardware 정보


다음과 같이 PCI 디바이스 정보를 구할 수 있다.

~$ lspci

00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01)

00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 01)

00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 08)

00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)

00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)

00:07.7 System peripheral: VMware Virtual Machine Communication Interface (rev 10)

00:0f.0 VGA compatible controller: VMware SVGA II Adapter

00:10.0 SCSI storage controller: BusLogic BT-946C (BA80C30) [MultiMaster 10] (rev 01)

00:11.0 PCI bridge: VMware PCI bridge (rev 02)

00:15.0 PCI bridge: VMware PCI Express Root Port (rev 01)

00:15.1 PCI bridge: VMware PCI Express Root Port (rev 01)

00:15.2 PCI bridge: VMware PCI Express Root Port (rev 01)

00:15.3 PCI bridge: VMware PCI Express Root Port (rev 01)

00:15.4 PCI bridge: VMware PCI Express Root Port (rev 01)

00:15.5 PCI bridge: VMware PCI Express Root Port (rev 01)

00:15.6 PCI bridge: VMware PCI Express Root Port (rev 01)

00:15.7 PCI bridge: VMware PCI Express Root Port (rev 01)

00:16.0 PCI bridge: VMware PCI Express Root Port (rev 01)

00:16.1 PCI bridge: VMware PCI Express Root Port (rev 01)

00:16.2 PCI bridge: VMware PCI Express Root Port (rev 01)

00:16.3 PCI bridge: VMware PCI Express Root Port (rev 01)

00:16.4 PCI bridge: VMware PCI Express Root Port (rev 01)

00:16.5 PCI bridge: VMware PCI Express Root Port (rev 01)

00:16.6 PCI bridge: VMware PCI Express Root Port (rev 01)

00:16.7 PCI bridge: VMware PCI Express Root Port (rev 01)

00:17.0 PCI bridge: VMware PCI Express Root Port (rev 01)

00:17.1 PCI bridge: VMware PCI Express Root Port (rev 01)

00:17.2 PCI bridge: VMware PCI Express Root Port (rev 01)

00:17.3 PCI bridge: VMware PCI Express Root Port (rev 01)

00:17.4 PCI bridge: VMware PCI Express Root Port (rev 01)

00:17.5 PCI bridge: VMware PCI Express Root Port (rev 01)

00:17.6 PCI bridge: VMware PCI Express Root Port (rev 01)

00:17.7 PCI bridge: VMware PCI Express Root Port (rev 01)

00:18.0 PCI bridge: VMware PCI Express Root Port (rev 01)

00:18.1 PCI bridge: VMware PCI Express Root Port (rev 01)

00:18.2 PCI bridge: VMware PCI Express Root Port (rev 01)

00:18.3 PCI bridge: VMware PCI Express Root Port (rev 01)

00:18.4 PCI bridge: VMware PCI Express Root Port (rev 01)

00:18.5 PCI bridge: VMware PCI Express Root Port (rev 01)

00:18.6 PCI bridge: VMware PCI Express Root Port (rev 01)

00:18.7 PCI bridge: VMware PCI Express Root Port (rev 01)

02:00.0 USB Controller: Intel Corporation 82371AB/EB/MB PIIX4 USB

02:01.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10)

02:02.0 Multimedia audio controller: Ensoniq ES1371 [AudioPCI-97] (rev 02)

02:03.0 USB Controller: VMware USB2 EHCI Controller

~$


-v를 추가하여 자세한 정보를 확인할 수 있다.

~$ lspci -v

00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01)

Subsystem: VMware Virtual Machine Chipset

Flags: bus master, medium devsel, latency 0

Kernel driver in use: agpgart-intel


00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 01) (prog-if 00 [Normal decode])

Flags: bus master, 66MHz, medium devsel, latency 0

Bus: primary=00, secondary=01, subordinate=01, sec-latency=64

Kernel modules: shpchp

...

02:03.0 USB Controller: VMware USB2 EHCI Controller (prog-if 20 [EHCI])

Subsystem: VMware USB2 EHCI Controller

Physical Slot: 35

Flags: bus master, fast devsel, latency 64, IRQ 17

Memory at d8900000 (32-bit, non-prefetchable) [size=4K]

Kernel driver in use: ehci_hcd


~$


-vv면 좀더 많은 정보가 확인된다.

00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01)

Subsystem: VMware Virtual Machine Chipset

Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-

Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-

Latency: 0

Kernel driver in use: agpgart-intel


00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 01) (prog-if 00 [Normal decode])

Control: I/O+ Mem+ BusMaster+ SpecCycle+ MemWINV+ VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-

Status: Cap- 66MHz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-

Latency: 0

Bus: primary=00, secondary=01, subordinate=01, sec-latency=64

Secondary status: 66MHz+ FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- <SERR- <PERR-

BridgeCtl: Parity- SERR- NoISA+ VGA- MAbort- >Reset- FastB2B+

PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-

Kernel modules: shpchp

...

02:03.0 USB Controller: VMware USB2 EHCI Controller (prog-if 20 [EHCI])

Subsystem: VMware USB2 EHCI Controller

Physical Slot: 35

Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-

Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-

Latency: 64 (1500ns min, 63750ns max)

Interrupt: pin A routed to IRQ 17

Region 0: Memory at d8900000 (32-bit, non-prefetchable) [size=4K]

Kernel driver in use: ehci_hcd


dmidecode를 통해 hardware component 정보를 표시한다. BIOS에서 지원되는 기술도 포함된다.

~$ sudo dmidecode

# dmidecode 2.9

SMBIOS 2.4 present.

364 structures occupying 16052 bytes.

Table at 0x000E0010.


Handle 0x0000, DMI type 0, 24 bytes

BIOS Information

Vendor: Phoenix Technologies LTD

Version: 6.00

Release Date: 06/02/2011

Address: 0xEA170

Runtime Size: 89744 bytes

ROM Size: 64 kB

Characteristics:

ISA is supported

PCI is supported

PC Card (PCMCIA) is supported

PNP is supported

APM is supported

BIOS is upgradeable

BIOS shadowing is allowed

ESCD support is available

Boot from CD is supported

Selectable boot is supported

EDD is supported

Print screen service is supported (int 5h)

8042 keyboard services are supported (int 9h)

Serial services are supported (int 14h)

Printer services are supported (int 17h)

CGA/mono video services are supported (int 10h)

ACPI is supported

Smart battery is supported

BIOS boot specification is supported

Function key-initiated network boot is supported

Targeted content distribution is supported

BIOS Revision: 4.6

Firmware Revision: 0.0

...

Handle 0x0169, DMI type 33, 31 bytes

64-bit Memory Error Information

Type: OK

Granularity: Unknown

Operation: Unknown

Vendor Syndrome: Unknown

Memory Array Address: Unknown

Device Address: Unknown

Resolution: Unknown


Handle 0x016A, DMI type 126, 4 bytes

Inactive


Handle 0x016B, DMI type 127, 4 bytes

End Of Table

~$


다음과 같이 hdparam을 통해 hard disk 정보를 보고 변경할 수 있다. (주의 : 설정변경으로 인해 hard disk의 data에 damage를 줄 수 있다)


~$ sudo hdparm /dev/sdb


/dev/sdb:

 HDIO_DRIVE_CMD(identify) failed: Invalid argument

 readonly      =  0 (off)

 readahead     = 256 (on)

 geometry      = 5221/255/63, sectors = 83886080, start = 0

~$


Hard disk의 identification 정보를 자세히 볼 수 있는데, 아래는 현재 지원되는 hard disk가 아니다.

~$ sudo hdparm -I /dev/sda


/dev/sda:

 HDIO_DRIVE_CMD(identify) failed: Invalid argument

~$


반응형
반응형

linux에서는 system clock과 hardware clock, 두개로 나눠진다.

system clock은 file 생성, process 실행, 그리고 날자와 시각이 필요한 곳에 쓰인다. date 명령 혹은 ntpd service를 통해 수동 혹은 자동으로 설정 혹은 조회가 가능하다.

hardware clock은 motherboard의 CMOS 설정과 관련있다. hwclock 명령으로 설정할 수 있다.

이외에도 clockdiff나 uptime등의 명령이 있다.


system clock 정보 표시하고 설정하기


다음과 같이 timezone을 설정할 수 있다.

~$ sudo cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime

~$


현재의 날자와 시각, 그리고 timezone을 표시한다.

~$ date

Thu Dec 26 17:12:37 KST 2013

~$


주, 월, 일, 년을 표시한다.

~$ date '+%A %B %d %G'

Thursday December 26 2013

~$


date 출력에 메시지를 추가한다.

~$ date '+The date today is %F.'

The date today is 2013-12-26.

~$


오늘로 부터 4주뒤를 표시한다.

~$ date --date='4 weeks'

Thu Jan 23 17:13:09 KST 2014

~$


오늘로 부터 8개월 3일 뒤를 출력한다.

~$ date --date='8 months 3 days'

Fri Aug 29 17:13:28 KST 2014

~$


7월 4일의 요일을 표시한다.

~$ date --date='4 Jul' +%A

Thursday

~$


다음과 같이 cal 명령을 사용할 수 있다.

~$ cal

   December 2013      

Su Mo Tu We Th Fr Sa  

 1  2  3  4  5  6  7  

 8  9 10 11 12 13 14  

15 16 17 18 19 20 21  

22 23 24 25 26 27 28  

29 30 31              

                      

~$


다음과 같이 1년치를 볼 수 있다.

~$ cal 2014

                            2014

      January               February               March          

Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  

          1  2  3  4                     1                     1  

 5  6  7  8  9 10 11   2  3  4  5  6  7  8   2  3  4  5  6  7  8  

12 13 14 15 16 17 18   9 10 11 12 13 14 15   9 10 11 12 13 14 15  

19 20 21 22 23 24 25  16 17 18 19 20 21 22  16 17 18 19 20 21 22  

26 27 28 29 30 31     23 24 25 26 27 28     23 24 25 26 27 28 29  

                                            30 31                 

...


Julian 달력이 표시된다.

~$ cal -j

       December 2013         

 Su  Mo  Tu  We  Th  Fr  Sa  

335 336 337 338 339 340 341  

342 343 344 345 346 347 348  

349 350 351 352 353 354 355  

356 357 358 359 360 361 362  

363 364 365                  

                             

~$


다음과 같이 날자와 시각을 변경한다.

~$ sudo date 122801012013

Sat Dec 28 01:01:00 KST 2013

~$


7분 뒤로 설정한다.

~$ date

Thu Dec 26 17:30:56 KST 2013

~$ sudo date --set='+7 minutes'

Thu Dec 26 17:38:00 KST 2013

~$


한달 전으로 간다.

~$ date

Thu Dec 26 17:39:11 KST 2013

~$ sudo date --set='-1 month'

Tue Nov 26 17:39:15 KST 2013

~$


hardware clock 정보 표시하고 설정하기


다음과 같이 hwclock을 사용하여 hardware clock 정보를 가져온다.

~$ date

Thu Dec 26 17:45:05 KST 2013

~$ sudo hwclock -r

Thu 26 Dec 2013 05:31:08 PM KST  -1.043171 seconds

~$


위와 같은 상황에서 hardware clock으로 부터 system clock을 맞추면 다음과 같다.

~$ sudo hwclock --hctosys

~$ date

Thu Dec 26 17:32:09 KST 2013

~$ sudo hwclock -r

Thu 26 Dec 2013 05:32:14 PM KST  -1.041147 seconds

~$


이와 반대로 system clock으로 부터 hardware clock을 맞추면 다음과 같다.

~$ sudo hwclock --systohc

~$


hardware clock은 보통 정확하지 않고, 약간의 오차가 있는데, 이를 보정한다. /etc/adjtime이 사용된다.

~$ sudo hwclock --adjust

~$


다음과 같이 hardware clock을 설정할 수 있다.

~$ sudo hwclock --set --date="12/26/13 17:40:00"

~$ date

Thu Dec 26 17:38:56 KST 2013

~$ sudo hwclock -r

Thu 26 Dec 2013 05:40:08 PM KST  -1.042400 seconds

~$


시간 설정을 위한 Network Time Protocol(NTP) 사용하기


시스템 reboot일 때, 현재 날자와 시각 정보를 Network Time Protocol(NTP) 서버로 부터 가져와 자동으로 설정할 수 있다. 해당 옵션을 사용하는 경우, ntpd daemon을 설치하고, 동기화를 시도한다. 만일, ntpd를 linux 설치 이후에 추가하려고 한다면, sudo apt-get install ntp 명령이 필요할지 모른다.


ntpd를 수동이든 linux 설치시 자동이든, 설치가 되었다면, UDP 123번 port를 listen하는데, 특별한 필요(GPS 수신기가 있다던지, atomic 시계가 있다던지)가 아니라면, 자원의 낭비 혹은 보안 취약점이 발생할 수 있다. 이러한 이유로, 관리자들은 보통 ntpdate(보통 daily cronjob에 포함됨)를 선호한다.


다음과 같이 NTP를 통한 시간 설정이 가능하다.

~$ sudo ntpdate pool.ntp.org

27 Dec 09:31:39 ntpdate[4212]: step time server 143.248.25.208 offset 49.378673 sec

~$


sudo ntpd -qg가 사용되기도 하는데, -q는 첫 시간 설정이후 ntpd를 종료하는 것이며, -g는 1000초를 벗어나는 특별한 경우, 종료되도록 한다.

반응형
반응형

[Research/Ubuntu] - [Linux/Ubuntu 시스템 관리] CPU 사용량 모니터링 (iostat, dstat)에서 cpu 사용량 체크를 하였다. 이제 disk 사용에 대한 모니터링을 해보자.


disk 사용 모니터링은 아래와 같이 iostat을 사용할 수 있다(필요한 경우 sudo apt-get install sysstat 실행).


~$ iostat 3

Linux 2.6.38-8-generic (greenfish-virtual-machine)  12/26/2013  _i686_ (1 CPU)


avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           0.51    0.04    0.34    0.39    0.00   98.73


Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn

sda               0.01         0.05         0.00        856          0

sdb               6.07       136.48       282.56    2486324    5147416


avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           1.68    0.00   39.26   59.06    0.00    0.00


Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn

sda               0.00         0.00         0.00          0          0

sdb            1129.87     71508.72     71863.09     213096     214152


avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           2.35    0.00   29.19   68.46    0.00    0.00


Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn

sda               0.00         0.00         0.00          0          0

sdb            1101.34     68083.22     71081.88     202888     211824

...


vmstat 명령으로 확인할 수 있다.

~$ vmstat -d

disk- ------------reads------------ ------------writes----------- -----IO------

       total merged sectors      ms  total merged sectors      ms    cur    sec

ram0       0      0       0       0      0      0       0       0      0      0

ram1       0      0       0       0      0      0       0       0      0      0

ram2       0      0       0       0      0      0       0       0      0      0

...

loop7      0      0       0       0      0      0       0       0      0      0

sr0        0      0       0       0      0      0       0       0      0      0

sda      107      0     856     100      0      0       0       0      0      0

sdb    71969  27636 3556116  210176  56937 730120 6296464 9890772      0    163

fd0        0      0       0       0      0      0       0       0      0      0

~$


아래는 read/write 정보를 표기한 것이다. 몇몇 장치(LVM, RAID, ...)에서는 동작하지 않는다.

~$ vmstat -p sdb5

sdb5          reads   read sectors  writes    requested writes

               71405    3550450      56866    6280640

~$


아래와 같이 현재 열려있는 file이나 directory를 표시한다.

~$ sudo lsof | less

다음과 같이 진행된다.

COMMAND    PID       USER   FD      TYPE     DEVICE  SIZE/OFF       NODE NAME

init         1       root  cwd       DIR       8,21      4096          2 /

init         1       root  rtd       DIR       8,21      4096          2 /

init         1       root  txt       REG       8,21    124704    1439034 /sbin/init

init         1       root  mem       REG       8,21     79672     524137 /lib/i386-linux-gnu/libnsl-2.13.so

init         1       root  mem       REG       8,21    243400     524106 /lib/i386-linux-gnu/libdbus-1.so.3.5.4

init         1       root  mem       REG       8,21    117960     524084 /lib/i386-linux-gnu/ld-2.13.so

init         1       root  mem       REG       8,21     29984     523327 /lib/libnih-dbus.so.1.0.0

init         1       root  mem       REG       8,21   1434180     524097 /lib/i386-linux-gnu/libc-2.13.so

init         1       root  mem       REG       8,21     75040     523329 /lib/libnih.so.1.0.0

init         1       root  mem       REG       8,21     38500     524147 /lib/i386-linux-gnu/libnss_nis-2.13.so

init         1       root  mem       REG       8,21     26400     524139 /lib/i386-linux-gnu/libnss_compat-2.13.so

init         1       root  mem       REG       8,21     42580     524143 /lib/i386-linux-gnu/libnss_files-2.13.so

:

...

~$


bash shell에 의해 열려있는 파일을 확인한다.

~$ lsof -c bash

COMMAND  PID      USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME

bash    5158 greenfish  cwd    DIR   8,21     4096 1177348 /home/greenfish

bash    5158 greenfish  rtd    DIR   8,21     4096       2 /

bash    5158 greenfish  txt    REG   8,21   822420 2093060 /bin/bash

bash    5158 greenfish  mem    REG   8,21   223468  523323 /lib/libncurses.so.5.7

...

~$


각 프로세스의 각각 현재 directory를 표기한다.

~$ sudo lsof -d cwd

lsof: WARNING: can't stat() fuse.gvfs-fuse-daemon file system /home/greenfish/.gvfs

      Output information may be incomplete.

COMMAND    PID       USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME

init         1       root  cwd    DIR   8,21     4096       2 /

kthreadd     2       root  cwd    DIR   8,21     4096       2 /

ksoftirqd    3       root  cwd    DIR   8,21     4096       2 /

...

sudo      5336       root  cwd    DIR   8,21     4096 1177348 /home/greenfish

lsof      5338       root  cwd    DIR   8,21     4096 1177348 /home/greenfish

lsof      5339       root  cwd    DIR   8,21     4096 1177348 /home/greenfish

~$


사용자별 열린 file과 directory를 표기한다.

~$ lsof -u greenfish

COMMAND    PID      USER   FD      TYPE     DEVICE SIZE/OFF       NODE NAME

gnome-key 1809 greenfish  cwd       DIR       8,21     4096          2 /

gnome-key 1809 greenfish  rtd       DIR       8,21     4096          2 /

...

lsof      5501 greenfish    4r     FIFO        0,8      0t0     176972 pipe

lsof      5501 greenfish    7w     FIFO        0,8      0t0     176973 pipe

~$


/mnt/sda1를 열은 process를 나열한다.

~$ lsof /mnt/sda1

COMMAND    PID      USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME

file_lock 5655 greenfish    3w   REG    8,1        0 11660 /mnt/sda1/lock.dmy

file_lock 5655 greenfish    4r   REG    8,1        0 11660 /mnt/sda1/lock.dmy

~$


/mnt/sda1/test_lock 하부 경로를 열은 process를 나열한다.

~$ lsof +d /mnt/sda1/test_lock/

COMMAND    PID      USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME

file_lock 5723 greenfish    3w   REG    8,1        0 11667 /mnt/sda1/test_lock/lock.dmy

file_lock 5723 greenfish    4r   REG    8,1        0 11667 /mnt/sda1/test_lock/lock.dmy

~$


반응형
반응형

[Research/Ubuntu] - [Linux/Ubuntu 시스템 관리] 메모리 체크 (free, top, vmstat, slabinfo, slabtop)

에 이어 이제는 CPU 사용량 모니터링에 대해 알아본다. (몇몇 명령은 sudp apt-get install sysstat이 필요하다)


~$ iostat -c 3

Linux 2.6.38-8-generic (greenfish-virtual-machine)  12/26/2013  _i686_ (1 CPU)


avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           0.22    0.04    0.17    0.20    0.00   99.36


avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           0.33    0.00    0.33    0.00    0.00   99.33


avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           0.00    0.00    0.00    0.00    0.00  100.00


avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           0.00    0.00    0.00    0.00    0.00  100.00


...

위 예는, iostat을 이용하여 cpu 사용량을 3초 주기로 출력하고 있다. 


다른 terminal에서, 다음 명령 (find-in-files, find in files)을 실행하여 cpu와 i/o에 부하를 준다.

~$ sudo find / -type f -name "*" | xargs grep 'int'

...


그 상황에서 다른 terminal에서 다음과 같이 cpu 사용량을 체크한다.

~$ iostat -c 3

Linux 2.6.38-8-generic (greenfish-virtual-machine)  12/26/2013  _i686_ (1 CPU)


avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           0.28    0.04    0.22    0.24    0.00   99.22


avg-cpu:  %user   %nice %system %iowait  %steal   %idle

          19.73    0.00   21.40   58.86    0.00    0.00


avg-cpu:  %user   %nice %system %iowait  %steal   %idle

          14.67    0.00   13.00   70.67    0.00    1.67


avg-cpu:  %user   %nice %system %iowait  %steal   %idle

          16.23    0.00   19.21   53.31    0.00   11.26


avg-cpu:  %user   %nice %system %iowait  %steal   %idle

          15.05    0.00   13.04   71.57    0.00    0.33


avg-cpu:  %user   %nice %system %iowait  %steal   %idle

          12.67    0.00   14.67   69.00    0.00    3.67


avg-cpu:  %user   %nice %system %iowait  %steal   %idle

          16.39    0.00    9.36   53.85    0.00   20.40

...

비교해보면, %iowait 수치가 상승함이 확인된다.


-t 옵션을 사용하여 time stamp를 출력하도록 한다. 1 5를 추가하면, 1초에 한번, 총 5번 출력하도록 한다.

~$ iostat -c -t

Linux 2.6.38-8-generic (greenfish-virtual-machine)  12/26/2013  _i686_ (1 CPU)


12/26/2013 03:40:00 PM

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           0.30    0.04    0.24    0.33    0.00   99.09


~$ iostat -c -t 1 5

Linux 2.6.38-8-generic (greenfish-virtual-machine)  12/26/2013  _i686_ (1 CPU)


12/26/2013 03:40:22 PM

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           0.30    0.04    0.24    0.33    0.00   99.09


12/26/2013 03:40:23 PM

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           0.00    0.00    0.00    0.00    0.00  100.00


12/26/2013 03:40:24 PM

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           0.00    0.00    0.00    1.98    0.00   98.02


12/26/2013 03:40:25 PM

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           1.00    0.00    0.00    0.00    0.00   99.00


12/26/2013 03:40:26 PM

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           1.00    0.00    0.00    0.00    0.00   99.00


~$


다음과 같이 dstat도 활용할 수 있다(필요한 경우, sudo apt-get install dstat를 해야한다.)

~$ dstat -t -c 3

----system---- ----total-cpu-usage----

     time     |usr sys idl wai hiq siq

26-12 15:47:12|  0   0  99   0   0   0

26-12 15:47:15|  0   0 100   0   0   0

26-12 15:47:18|  8   7  73  12   0   0

26-12 15:47:21| 22  19  44  14   0   1

26-12 15:47:24| 15  26  24  31   0   4

26-12 15:47:27|  8  24  38  27   0   3

26-12 15:47:30|  0   0  97   3   0   0

26-12 15:47:33|  0   0 100   0   0   0

26-12 15:47:36|  1   0  99   0   0   0 

26-12 15:47:37|  0   0 100   0   0   0^C

~$


혹은 다음과 같이 top을 이용할 수 있다.

~$ top


다음과 같은 화면이 발생한다.

top - 15:55:25 up  4:42,  2 users,  load average: 0.00, 0.03, 0.06

Tasks: 132 total,   2 running, 129 sleeping,   0 stopped,   1 zombie

Cpu(s):  3.3%us,  0.0%sy,  0.0%ni, 96.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Mem:    508000k total,   460408k used,    47592k free,    80768k buffers

Swap:   522236k total,     8436k used,   513800k free,   127084k cached


  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            

 4542 greenfis  20   0 91132  13m  10m R  4.0  2.8   0:00.30 gnome-terminal     

 1667 root      20   0  169m  28m 6112 S  2.0  5.8   0:29.97 Xorg               

  313 root      20   0     0    0    0 S  0.3  0.0   0:00.37 jbd2/sdb5-8        

 1996 greenfis  20   0 81076  11m 9352 S  0.3  2.4   0:10.89 wnck-applet        

    1 root      20   0  2916 1528 1100 S  0.0  0.3   0:01.26 init               

    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd           

    3 root      20   0     0    0    0 S  0.0  0.0   0:00.24 ksoftirqd/0        

    6 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0        

    7 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 cpuset             

    8 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 khelper            

    9 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 netns              

   10 root      20   0     0    0    0 S  0.0  0.0   0:00.03 sync_supers        

   11 root      20   0     0    0    0 S  0.0  0.0   0:00.00 bdi-default        

   12 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kintegrityd        

   13 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kblockd            

   14 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kacpid             

   15 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kacpi_notify       


위 화면에서 Shift+p를 누르면, 아래와 같이 cpu 사용량으로 정렬되어 표기된다.

top - 15:56:30 up  4:43,  2 users,  load average: 0.00, 0.02, 0.06

Tasks: 132 total,   2 running, 129 sleeping,   0 stopped,   1 zombie

Cpu(s):  3.3%us,  0.3%sy,  0.0%ni, 96.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Mem:    508000k total,   478784k used,    29216k free,    80812k buffers

Swap:   522236k total,     8436k used,   513800k free,   145340k cached


  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            

 4542 greenfis  20   0 91272  14m  10m R  4.3  2.8   0:00.85 gnome-terminal     

 1667 root      20   0  169m  28m 6120 S  2.0  5.8   0:30.48 Xorg               

 1444 root      20   0 25312 2416 2088 S  0.3  0.5   0:09.75 vmtoolsd           

 1926 greenfis  20   0 95508  12m 9212 S  0.3  2.6   0:13.23 vmtoolsd           

 1996 greenfis  20   0 81076  11m 9352 S  0.3  2.4   0:10.94 wnck-applet        

 4615 greenfis  20   0  2632 1140  860 R  0.3  0.2   0:00.02 top                

    1 root      20   0  2916 1528 1100 S  0.0  0.3   0:01.26 init               

    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd           

    3 root      20   0     0    0    0 S  0.0  0.0   0:00.24 ksoftirqd/0        

    6 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0        

    7 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 cpuset             

    8 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 khelper            

    9 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 netns              

   10 root      20   0     0    0    0 S  0.0  0.0   0:00.03 sync_supers        

   11 root      20   0     0    0    0 S  0.0  0.0   0:00.00 bdi-default        

   12 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kintegrityd        

   13 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kblockd            


만약, cpu processor의 정보를 구하고자 한다면, 다음과 같이 진행하면 된다.

~$ cat /proc/cpuinfo

processor : 0

vendor_id : GenuineIntel

cpu family : 6

model : 58

model name : Intel(R) Core(TM) i5-3570 CPU @ 3.40GHz

stepping : 9

cpu MHz : 3801.000

cache size : 6144 KB

fdiv_bug : no

hlt_bug : no

f00f_bug : no

coma_bug : no

fpu : yes

fpu_exception : yes

cpuid level : 13

wp : yes

flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss nx rdtscp lm constant_tsc up arch_perfmon pebs bts xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm ida arat epb xsaveopt pln pts dts

bogomips : 7602.00

clflush size : 64

cache_alignment : 64

address sizes : 40 bits physical, 48 bits virtual

power management:


~$


반응형
반응형

주의를 가지지 않다보면, linux system은 때때로 사용 가능한 자원을 초과할 때가 있다. 시스템 모니터 도구는 이러한 자원 할당량 체크를 하는데 도움을 준다. 이와 유사하게, device driver등과 같은 시스템 관리는 때때로 발생하는 문제와 시스템 오류를 제거하는데 도움을 준다.


(참고) 몇몇 도구(iostat)들은 설치가 필요하며, 종합적으로 sysstat, 즉, sudo apt-get install sysstat을 설치하면 필요한 package가 모두 설치될 수 있다.


free 명령으로 사용중인 메모리의 양을 체크할 수 있다.


각 메모리 사용량이 KB 단위로 출력된다.

~$ free

             total       used       free     shared    buffers     cached

Mem:        508000     501336       6664          0     105460     174144

-/+ buffers/cache:     221732     286268

Swap:       522236       1564     520672

~$


각 메모리 사용량이 MB 단위로 출력된다.

~$ free -m

             total       used       free     shared    buffers     cached

Mem:           496        486          9          0        102        167

-/+ buffers/cache:        216        279

Swap:          509          1        508

~$


각 메모리 사용량이 block 단위로 출력된다.

~$ free -b

             total       used       free     shared    buffers     cached

Mem:     520192000  509865984   10326016          0  107962368  175190016

-/+ buffers/cache:  226713600  293478400

Swap:    534769664    1601536  533168128

~$


합계를 출력한다. (Swap+Mem)

~$ free -mt

             total       used       free     shared    buffers     cached

Mem:           496        486          9          0        103        167

-/+ buffers/cache:        216        279

Swap:          509          1        508

Total:        1006        487        518

~$


각 메모리 사용량이 GB 단위로 출력된다.

~$ free -g

             total       used       free     shared    buffers     cached

Mem:             0          0          0          0          0          0

-/+ buffers/cache:          0          0

Swap:            0          0          0

~$


2초 단위로 출력한다.

~$ free -s 2

             total       used       free     shared    buffers     cached

Mem:        508000     498048       9952          0     105496     171088

-/+ buffers/cache:     221464     286536

Swap:       522236       1564     520672


             total       used       free     shared    buffers     cached

Mem:        508000     498056       9944          0     105496     171088

-/+ buffers/cache:     221472     286528

Swap:       522236       1564     520672


             total       used       free     shared    buffers     cached

Mem:        508000     498180       9820          0     105512     171072

-/+ buffers/cache:     221596     286404

Swap:       522236       1564     520672


...


RAM의 낭비와 속도 향상을 위해 Linux에서는 disk cache 공간을 사용한다. 첫줄, 즉, Mem:은 이러한 disk cache 공간을 모두 포함한 값을 사용한다. 그래서 실제로, 물리적인 RAM의 사용량을 체크하려면 두번째 줄인 -/+ buffers 부분을 참고해야 한다. 위 free -s 2의 마지막 부분에서, 221MB가 사용되고 286MB가 사용 가능한 크기이다.


top 명령(

[Research/Ubuntu] - [Linux/Ubuntu process 관리] ps, top을 이용하여 프로세스(process) 관리하기 참고)을 이용하여 화면 친화적 출력으로 확인이 가능하다.


~$ top


다음과 같은 화면이 지속적으로 갱신된다.

top - 14:16:21 up  5:20,  2 users,  load average: 0.00, 0.01, 0.05

Tasks: 132 total,   1 running, 130 sleeping,   0 stopped,   1 zombie

Cpu(s):  3.3%us,  0.0%sy,  0.0%ni, 96.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Mem:    508000k total,   500188k used,     7812k free,   105872k buffers

Swap:   522236k total,     1564k used,   520672k free,   171372k cached


  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            

 4325 greenfis  20   0 91124  13m  10m S  3.7  2.8   0:00.34 gnome-terminal     

 1667 root      20   0  168m  30m 7592 S  2.3  6.1   0:21.89 Xorg               

 4317 root      20   0     0    0    0 S  0.3  0.0   0:00.06 kworker/0:1        

 4382 greenfis  20   0  2632 1140  860 R  0.3  0.2   0:00.09 top                

    1 root      20   0  2916 1752 1272 S  0.0  0.3   0:01.24 init               

    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd           

    3 root      20   0     0    0    0 S  0.0  0.0   0:00.12 ksoftirqd/0        

    6 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0        

    7 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 cpuset             

    8 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 khelper            

    9 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 netns              

   10 root      20   0     0    0    0 S  0.0  0.0   0:00.04 sync_supers        

   11 root      20   0     0    0    0 S  0.0  0.0   0:00.00 bdi-default        

   12 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kintegrityd        

   13 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kblockd            


Shift+M을 눌러 메모리 사용량으로 정렬된 결과를 볼 수 있다. 


vmstat을 호출하여 가상 메모리 통계를 확인할 수 있다.

~$ vmstat 5

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----

 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa

 0  0   1564   9092 105920 171408    0    0    20     4   86  116  0  0 99  0

 0  0   1564   9084 105928 171408    0    0     0    14  147  283  0  0 99  0

...

위 예는 5초마다 한번씩 메모리 정보를 출력해 준다. 


-S m은 (/1000k)MB단위, -S M은 (/1024k)MB 단위, -S k는 1000B 단위, -S K는 1024B 단위, -n 2 10은 매 2초마다 갱신, 총 10회까지 출력을 의미한다. 


아래와 같이 -s를 사용하여 메모리 체크를 위한 항목들을 확인할 수 있다.

~$ vmstat -s

       508000 K total memory

       499512 K used memory

       227172 K active memory

       224120 K inactive memory

         8488 K free memory

       106024 K buffer memory

       171400 K swap cache

       522236 K total swap

...


| less를 사용하여 화면 단위로 확인할 수 있으며, -M 사용으로 MB 단위로 출력된다.

~$ vmstat -S M -s | less


          496 M total memory

          488 M used memory

          222 M active memory

          218 M inactive memory

            7 M free memory

          103 M buffer memory

          167 M swap cache

          509 M total swap

            1 M used swap

          508 M free swap

         4084 non-nice user cpu ticks

          684 nice user cpu ticks

         2794 system cpu ticks

      1973994 idle cpu ticks

         3467 IO-wait cpu ticks

            0 IRQ cpu ticks

          127 softirq cpu ticks

            0 stolen cpu ticks

       379206 pages paged in

        72868 pages paged out

            8 pages swapped in

          399 pages swapped out

      1712065 interrupts

:


linux kernel에서는 kernel slab이라는 memory cache를 가지고 있는데, vmstat 명령으로 확인 가능하다.

(/proc/slabinfo로 확인 가능)

~$ sudo vmstat -m

Cache                       Num  Total   Size  Pages

hgfsInodeCache               10     10    384     10

ext4_groupinfo_4k           312    312    104     39

UDPLITEv6                     0      0    704     11

UDPv6                        11     11    704     11

tw_sock_TCPv6                 0      0    256     16

...

~$


top과 유사한 slabtop도 사용할 수 있다.

~$ sudo slaptop


다음과 같은 화면으로 정보가 표시된다.

 Active / Total Objects (% used)    : 183955 / 190417 (96.6%)

 Active / Total Slabs (% used)      : 5716 / 5716 (100.0%)

 Active / Total Caches (% used)     : 68 / 97 (70.1%)

 Active / Total Size (% used)       : 31364.80K / 32697.65K (95.9%)

 Minimum / Average / Maximum Object : 0.01K / 0.17K / 8.00K


  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   

 34091  33764  99%    0.05K    467       73      1868K buffer_head

 26351  25427  96%    0.59K   2027       13     16216K ext4_inode_cache

...



반응형
반응형

pgrep으로 process 검색하기


다음과 같이 'gnome' 문자열을 포함하는 프로세스의 PID를 나열한다.

~$ pgrep gnome

1809

1828

1879

1911

1918

1923

2089

3857

3860

~$


-l 옵션을 사용하여 명령을 구한다.

~$ pgrep -l gnome

1809 gnome-keyring-d

1828 gnome-session

1879 gnome-settings-

1911 gnome-panel

1918 polkit-gnome-au

1923 gnome-power-man

2089 gnome-screensav

3919 gnome-terminal

3922 gnome-pty-helpe

~$


특정 user의 프로세스를 구한다.

~$ pgrep -lu greenfish

1809 gnome-keyring-d

1828 gnome-session

1861 ssh-agent

...

4045 gnome-terminal

4048 gnome-pty-helpe

4049 bash

~$


gedit 프로세스를 구한다.

~$ ps -p `pgrep gedit`

  PID TTY          TIME CMD

 4286 ?        00:00:00 gedit

~$


gedit 프로세스를 구한다(full 정보).

~$ ps -fp $(pgrep gedit)

UID        PID  PPID  C STIME TTY          TIME CMD

1000      4286     1  0 14:04 ?        00:00:00 gedit

~$


gnome을 포함하는 여러개의 프로세스를 구한다. `pgrep gnome`은 1809 ... 와 같은 효과를 준다.

$(pgrep gnome)도 마찬가지이다.

~$ ps -p `pgrep gnome`

  PID TTY      STAT   TIME COMMAND

 1809 ?        Sl     0:00 /usr/bin/gnome-keyring-daemon --daemonize --login

 1828 ?        Ssl    0:00 gnome-session --session=ubuntu

 1879 ?        Ssl    0:01 /usr/lib/gnome-settings-daemon/gnome-settings-daemon

 1911 ?        Sl     0:01 gnome-panel

 1918 ?        Sl     0:00 /usr/lib/policykit-1-gnome/polkit-gnome-authenticatio

 1923 ?        Sl     0:00 gnome-power-manager

 2089 ?        Ss     0:00 gnome-screensaver

 4445 ?        Sl     0:00 gnome-terminal

 4448 ?        S      0:00 gnome-pty-helper

~$ ps -p 1809 1828 1879 1911 1918 1923 2089 4445 4448

  PID TTY      STAT   TIME COMMAND

 1809 ?        Sl     0:00 /usr/bin/gnome-keyring-daemon --daemonize --login

 1828 ?        Ssl    0:00 gnome-session --session=ubuntu

 1879 ?        Ssl    0:01 /usr/lib/gnome-settings-daemon/gnome-settings-daemon

 1911 ?        Sl     0:01 gnome-panel

 1918 ?        Sl     0:00 /usr/lib/policykit-1-gnome/polkit-gnome-authenticatio

 1923 ?        Sl     0:00 gnome-power-manager

 2089 ?        Ss     0:00 gnome-screensaver

 4445 ?        Sl     0:01 gnome-terminal

 4448 ?        S      0:00 gnome-pty-helper

~$


gedit를 찾아 우선순위를 향상시킨다.

~$ sudo renice -5 $(pgrep gedit)

4286: old priority 0, new priority -5

~$


fuser를 사용하여 프로세스 검색하기


우선, 

[Research/Ubuntu] - [Linux/Ubuntu 파일 시스템 관리] file system mount, un-mount(마운트, umount) 하기

에 있는 file_lock.c를 다음과 같이 빌드한다.(해당 post에 있는 lsof 명령과 fuser는 밀접한 관계가 있다)

~$ gedit file_lock.c

~$ cc -o file_lock file_lock.c

file_lock.c: In function ‘main’:

file_lock.c:16:7: warning: incompatible implicit declaration of built-in function ‘exit’

~$


다음과 같이 lock_me.dmy 파일을 생성한다.

~$ echo "01234567890" >> lock_me.dmy

~$


다음과 같이 file_lock을 실행하고, CTRL+Z를 누른다. 그리고, -auv 옵션을 이용하여 lock_me.dmy 파일을 열고 있는 프로세스를 나열한다.

~$ ./file_lock lock_me.dmy 

Return value of fcntl:0

[0000](11) 0123456789

[0001](11) 0123456789

^Z

[1]+  Stopped                 ./file_lock lock_me.dmy

~$ ./file_lock lock_me.dmy 

Return value of fcntl:0

[0000](11) 0123456789

[0001](11) 0123456789

[0002](11) 0123456789

^Z

[2]+  Stopped                 ./file_lock lock_me.dmy

~$ fuser -auv lock_me.dmy

                     USER        PID ACCESS COMMAND

lock_me.dmy:         greenfish   4100 F.... (greenfish)file_lock

                     greenfish   4101 F.... (greenfish)file_lock

~$

-a는 모든 프로세스를, -u는 프로세스의 owner를, -v는 자세한 정보를 출력해주는 옵션이다.


아래와 같이 -m 옵션을 이용하면, lock_me.dmy가 mount되어 있는 file system에서 실행되고 있는 프로세스를 나열한다.

~$ fuser -mauv lock_me.dmy

                     USER        PID ACCESS COMMAND

lock_me.dmy:         root     kernel mount (root)/

                     greenfish   1809 Frce. (greenfish)gnome-keyring-d

                     greenfish   1828 Frce. (greenfish)gnome-session

...

                     greenfish   4100 Frce. (greenfish)file_lock

                     greenfish   4101 Frce. (greenfish)file_lock

                     greenfish   4106 .rce. (greenfish)bash

~$

위 열거된 프로세스의 command는 모두 lock_me.dmy가 mount된 file system에 있는 파일이다.


아래와 같이 lock_me.dmy를 열고 있는 프로세스를 강제 종료한다.(SIGKILL)

~$ fuser -k lock_me.dmy

lock_me.dmy:          4100  4101

[1]-  Killed                  ./file_lock lock_me.dmy

[2]+  Killed                  ./file_lock lock_me.dmy

~$


그러면 아래와 같이 이제 실행되는 프로세스가 없다.

~$ fuser -auv lock_me.dmy

                     USER        PID ACCESS COMMAND

lock_me.dmy:

~$


fuser에서 지원되는 signal를 나열한다.

~$ fuser -l

HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM

STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS

UNUSED

~$


다음과 같이 gedit에 HUP signal을 보낸다.

~$ sudo fuser -k -HUP /usr/bin/gedit

/usr/bin/gedit:       4186e

~$


실행중인 process 변경하기


실행중인 process의 행동을 변경할 수 있다. renice 명령으로 실행중인 process에 대한 시스템의 scheduler의 priority를 조절할 수 있다. nice 명령으로 default priority를 결정하고 process 실행시의 priority를 높이거나 낮출 수 있다. (주의: nice를 통해 높은 우선순위(음수)를 지정하는 경우 시스템의 crash를 유발할 수 있음)


현재의 nice 값은 다음과 같이 확인한다.

~$ nice

0

~$


다음과 같이 ls 명령의 nice를 변경하여 실행할 수 있다.

높은 우선순위인 경우, root 권한이 필요하다.

~$ nice -n 10 ls

backup_000  Documents  examples.desktop  mybackup  poem    temp       Videos

Desktop     Downloads  Music  Pictures  Public  Templates

~$ nice -n -10 ls

nice: cannot set niceness: Permission denied

backup_000  Documents  examples.desktop  mybackup  poem    temp       Videos

Desktop     Downloads  Music  Pictures  Public  Templates

~$ sudo nice -n -10 ls

backup_000  Documents  examples.desktop  mybackup  poem    temp       Videos

Desktop     Downloads  Music  Pictures  Public  Templates

~$


아래와 같이 특정 사용자 권한으로 실행되는 process의 nice를 일괄 수정할 수 있다.

~$ ps -u greenfish -o pid,comm,nice

  PID COMMAND          NI

 1809 gnome-keyring-d   0

 1828 gnome-session     0

 1861 ssh-agent         0

...

 3561 bash              0

 3625 bash              0

 3680 ps                0

~$ renice +2 -u greenfish

1000: old priority 0, new priority 2

~$ ps -u greenfish -o pid,comm,nice

  PID COMMAND          NI

 1809 gnome-keyring-d   2

 1828 gnome-session     2

 1861 ssh-agent         2

 3561 bash              2

 3625 bash              2

 3682 ps                2

~$


다음과 같이 특정 process의 nice를 수정할 수 있다.

~$ ps -p 3561 -o pid,comm,nice

  PID COMMAND          NI

 3561 bash              2

~$ renice +3 3561

3561: old priority 2, new priority 3

~$ ps -p 3561 -o pid,comm,nice

  PID COMMAND          NI

 3561 bash              3

~$


아래와 같이 특정 사용자에서 조건에 맞는 process의 nice를 조절할 수 있다.

~$ sudo renice -3 `pgrep -u greenfish bash`

3561: old priority 3, new priority -3

3625: old priority 2, new priority -3

~$


실행중인 process 변경하기


shell에서 실행된 명령은 기본적으로 foreground에서 실행된다. 이는, 해당 명령이 종료될 때 까지 다른 명령을 실행, 즉, 입력할 수 없다는 뜻이다. 명령에 &를 추가하면, background로 실행할 수 있다. fg, bg, 그리고 jobs 명령으로 background와 foreground간의 전환이 가능하다.


우선 다음과 같이 gedit를 실행한다. 우선, bg를 실행했을때 현재 background 작업이 없음이 확인된다.

~$ bg

bash: bg: current: no such job

~$ gedit


그리고, CTRL+Z를 누른다. 그러면, 다음과 같이 명령을 입력할 수 있다. 그러나, gedit GUI는 먹통이된다.

^Z

[1]+  Stopped                 gedit

~$


아래와 같이 실행하여 background인 gedit process를 시작시킨다. 이렇게 되면 gedit GUI가 사용가능하다.

~$ bg 1

[1]+ gedit &

~$


아래와 같이 실행하면 foreground로 전환되어, 기존의 gedit를 실행한것과 동일하게 block된 상태가 된다.

~$ fg 1

gedit


CTRL+C를 누르면 Kill된다. gedit 창은 종료된다.

^C

~$


앞선 예의 bg나 fg의 1은, 처음 ^Z될때 알려진 번호가 사용된다.


이제 다음과 같이 jobs 명령을 이용할 수 있다.

~$ gedit&

[1] 4121

~$ gcalctool&

[2] 4124

~$ jobs

[1]-  Running                 gedit &

[2]+  Running                 gcalctool &

~$ jobs -l

[1]-  4121 Running                 gedit &

[2]+  4124 Running                 gcalctool &

~$ jobs -l %2

[2]+  4124 Running                 gcalctool &

~$

gedit와 gcalctool 실행시 &를 추가하여 background로 실행한다. jobs를 통해 [1], [2] job을 확인할 수 있다. [2]에 +가 있음으로, 2번이 current job이 된다. job 번호를 명시하지 않는 경우, current job 번호가 기본값이 된다. -l 옵션을 사용하여 PID 확인이 가능하다. 뒤에 %2를 추가하여 해당 job만 확인할 수 있다.


~$ disown %2

~$ jobs -l

[1]+  4121 Running                 gedit &

~$

위와 같이 disown을 실행하여 shell과 분리할 수 있다. 이렇게 되면 shell이 종료되더라도 해당 job은 계속 실행될 수 있다.


~$ disown -h

~$ jobs -l

[1]+  4121 Running                 gedit &

~$

위 명령은, 현재 shell에서 보내진 HUP signal로 부터 보호하는 동작을 한다.


그리고 아래는 모든 job을 현재 shell로 부터 분리하는 것이다.

~$ disown -a

~$ jobs -l

~$


Process Kill과 Signal


process에 signal을 전달하여 동작을 중단하거나 변경할 수 있다. kill 혹은 killall은 process를 종료하기 위해 signal을 전달한다. signal은 다음과 같이 숫자나 문자로 표현된다.


 Signal 번호

 Singal 이름

 설명

 1

 SIGHUP

 terminal 종료 혹은 제어 process 종료

 2

 SIGINT

 키보드 인터럽트

 3

 SIGQUIT

 키보드 종료 (keyboard quit)

 4

 SIGILL

 비정상 명령 (illegal instruction)

 6

 SIGABRT

 중단 함수(abort function)로 부터 중단(abort) 전달

 8

 SIGFPE

 부동연산예외(floating point exception)

 9

 SIGKILL

 종료 signal

 11

 SIGSEGV

 잘못된 메모리 참조

 13

 SIGPIPE

 중단된 파이프 (파이프를 읽을 process가 없음)

 14

 SIGALRM

 알람 system call로 부터 timer signal

 15

 SIGTERM

 중단 signal (termination signal)

 30,10,16

 SIGUSER1

 사용자 정의

 31,12,17

 SIGUSER2

 사용자 정의

 20,17,18

 SIGCHLD

 child 종료 혹은 중단

 19,18,25

 SIGCONT

 process가 중단되었다면 진행

 17,19,23

 SIGSTOP

 process 중단

 18,20,24

 SIGTSTP

 terminal에 타이핑 중단

 21,21,26

 SIGTTIN

 background process로 부터 terminal 입력

 22,22,27

 SIGTTOU

 background process로 부터 terminal 출력


해당 process에 SIGTERM을 전달한다.

~$ gedit&

[1] 4350

~$ kill 4350

~$

[1]+  Terminated              gedit

~$


SIGKILL을 해당 process에 전달한다.

~$ gedit&

[1] 4353

~$ kill -9 4353

~$ 

[1]+  Killed                  gedit

~$


다음은 중단된 process를 재개한다.

CTRL+Z로 이뤄진 gedit의 GUI는 먹통이되는데, 이후의 SIGCONT로 인해 GUI가 다시 활성화된다.

~$ gedit

^Z

[1]+  Stopped                 gedit

~$ jobs -l

[1]+  4357 Stopped                 gedit

~$ kill -SIGCONT 4357

~$


job을 종료한다.

~$ gedit&

[1] 4365

~$ kill %1

~$ 

[1]+  Terminated              gedit

~$


gedit를 모두 종료한다.

~$ gedit&

[1] 4431

~$ gedit&

[2] 4434

~$ killall gedit

[1]-  Terminated              gedit

[2]+  Done                    gedit

~$


다음 명령으로 sendmail process가 다시 설정을 읽도록 한다.

~$ killall -SIGHUP sendmail


SIGKILL등은 비정상적인 상황을 만들 수 있다(데이터 유실). unix 시스템에서 SIGHUP signal은 terminal이 main frame으로 부터 disconnect될 때 발생하는 것으로 설계되었으나, sendmail 혹은 httpd 같은 daemon process는 SIGHUP를 설정을 다시 읽는 행동으로 연결하여 사용되기도 한다.


Shell로 부터 process 격리시키기


shell session이 종료되더라도 실행중인 process를 지속시키기 원한다면, 몇가지 방법이 있다. 우선, nohup 명령이 가능하다.


다음은 gedit를 shell과 분리하여 실행시킨다.

~$ nohup gedit &

[1] 4638

~$ nohup: ignoring input and appending output to `nohup.out'


~$


아래는 gcc를 높은 우선 순위로 shell과 분리하여 실행한다.

~$ sudo nohup nice -9 gcc file_lock.c &

[2] 4662

~$


Shell로 부터 process 격리시키기


현재 실행중인 shell session으로 부터 disconnect되더라도 계속 실행시키기 원한다면, 몇가지 방법이 있다. 그 중 하나가 아래와 같이 nohup를 이용하는 방법이다.


~$ nohup gedit &

[1] 3669

~$ nohup: ignoring input and appending output to `nohup.out'


~$ exit

nohup에 의해 실행이 block되기 때문에 보통 nohup로 실행시킬 명령에 &를 사용한다. 이렇게 생성된 process, 즉, gedit는 이후의 exit 명령이후에도 계속 실행된다. nohup로 실행하지 않은 일반적인 경우, shell이 exit되면 gedit도 함께 종료된다.


아래는 gcc를 높은 우선순위로 실행시키되 session 관계 없이 계속 실행시키도록 한다.

~$ sudo nohup nice -9 gcc file_lock.c &

[1] 3801

~$


이와 같이 nohup 명령은 보통 느린 CPU 혹은 dial-up 연결(연결된 상태가 비용이 많이 드는 경우)시 주로 사용된다. 오늘날은 screen 같은 명령에서 자주 사용되어, shell 연결이 끝어지더라도 session이 유지되도록 하는 것이다. 이는 이후 설명할 예정이다.


process 예약하기


cron 관련 명령을 이용하면 shell에 연결되지 않더라도 지정된 시간에 명령을 실행할 수 있다. at 명령은 설정한 시간에 명령을 실행하도록 한다.


~$ mkdir at_test

~$ cd at_test

~/at_test$ ls -la

total 8

drwxr-xr-x  2 greenfish greenfish 4096 2013-12-26 10:30 .

drwxr-xr-x 29 greenfish greenfish 4096 2013-12-26 10:30 ..

~/at_test$ at now +1 min

warning: commands will be executed using /bin/sh

at> ls > ls.txt

at> CTRL+D <EOT>

job 1 at Thu Dec 26 10:31:00 2013

~/at_test$ atq

1 Thu Dec 26 10:31:00 2013 a greenfish

~/at_test$ ls -la

total 8

drwxr-xr-x  2 greenfish greenfish 4096 2013-12-26 10:30 .

drwxr-xr-x 29 greenfish greenfish 4096 2013-12-26 10:30 ..

~/at_test$ atq

~/at_test$ ls -la

total 12

drwxr-xr-x  2 greenfish greenfish 4096 2013-12-26 10:31 .

drwxr-xr-x 29 greenfish greenfish 4096 2013-12-26 10:30 ..

-rw-r--r--  1 greenfish greenfish    7 2013-12-26 10:31 ls.txt

~/at_test$

위 예는 1 분뒤 명령을 실행하도록 at을 사용하고 있다. 중간, <EOT>를 위해 CTRL+D 키를 눌러야 한다. atq 명령을 사용하면 현재 at 명령으로 인한 작업 queue를 보여준다. 위 예는 같은 shell session을 사용하고 있지만, 중간에 exit한 상태에서도 ls.txt 파일은 생성된다.


batch는 시스템 부하가 0.8 이하인 경우 실행된다.

~$ mkdir batch_test

~$ cd batch_test/

~/batch_test$ batch

warning: commands will be executed using /bin/sh

at> ls > /home/greenfish/batch_test/ls.txt

at> <EOT>

job 4 at Thu Dec 26 10:36:00 2013

~/batch_test$ atq

~/batch_test$ ls -la

total 12

drwxr-xr-x  2 greenfish greenfish 4096 2013-12-26 10:37 .

drwxr-xr-x 30 greenfish greenfish 4096 2013-12-26 10:36 ..

-rw-r--r--  1 greenfish greenfish    7 2013-12-26 10:37 ls.txt

~/batch_test$


아래와 같이 atrm 명령으로 at 작업들을 삭제한다.

~$ at now +10 min

warning: commands will be executed using /bin/sh

at> ls > a.txt

at> <EOT>

job 5 at Thu Dec 26 10:53:00 2013

~$ at now +15 min

warning: commands will be executed using /bin/sh

at> ls > b.txt

at> <EOT>

job 6 at Thu Dec 26 10:58:00 2013

~$ atq

5 Thu Dec 26 10:53:00 2013 a greenfish

6 Thu Dec 26 10:58:00 2013 a greenfish

~$ atrm 5

~$ atq

6 Thu Dec 26 10:58:00 2013 a greenfish

~$


contab을 이용하여 반복적인 예약 작업을 실행할 수 있다. 다음과 같이 -e 옵션을 사용하여 개인용 crontab 파일을 생성할 수 있다.

~$ crontab -e

no crontab for greenfish - using an empty one


Select an editor.  To change later, run 'select-editor'.

  1. /bin/ed

  2. /bin/nano        <---- easiest

  3. /usr/bin/vim.tiny


Choose 1-3 [2]:

보통 vi editor가 실행되기도 하고, 위와 같이 editor를 선택하는 입력이 뜰 수 있다. 선호하는 editor를 선택하면 다음과 같은 파일을 설정할 수 있다.


# Edit this file to introduce tasks to be run by cron.

#

# Each task to run has to be defined through a single line

# indicating with different fields when the task will be run

# and what command to run for the task

#

# To define the time you can provide concrete values for

# minute (m), hour (h), day of month (dom), month (mon),

# and day of week (dow) or use '*' in these fields (for 'any').#

# Notice that tasks will be started based on the cron's system

# daemon's notion of time and timezones.

#

# Output of the crontab jobs (including errors) is sent through

# email to the user the crontab file belongs to (unless redirected).

#

# For example, you can run a backup of all your user accounts

# at 5 a.m every week with:

# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/

#

# For more information see the manual pages of crontab(5) and cron(8)

#

# m h  dom mon dow   command


위 파일 끝에 다음을 넣으면 매 10분에 ls 명령을 실행한다.

10 * * * * ls > a.txt


위 구문은 다음과 같다.

분 시 일 월 요일 명령

각 단위에 *를 사용하면 "어떤값"이라도 만족하겠다는 뜻으로, 위 예는 10분만 지정했기 때문에 매 10분에 해당 명령을 실행하게 되는 것이다.

각 단위는 ,를 사용하여 여러개 등록할 수 있다. 만일, 매 10분과 40분에 실행하고자 한다면, 다음과 같다.

10,40 * * * * ls > a.txt

또한 /를 사용하여 "마다"를 등록할 수 있다. 만일 10분 마다 실행하고자 한다면, 다음과 같다.

*/10 * * * * ls > a.txt

각 단위에 대한 설명은 다음과 같다.


 설명

 범위

 분

 0 ~ 59

 시

 0 ~ 23

 일

 0 ~ 31

 월

 1 ~ 12

 요일

 Mon(1), Tue(2), ..., Sat(6), Sun(0)

 명령

 반드시 한줄로 표현


10 * * * * ls > a.txt를 저장하고 나가면 다음과 같다.


...

Choose 1-3 [2]: 2

crontab: installing new crontab

~$


아래와 같이 crontab 파일의 내용을 확인할 수 있다.

~$ crontab -l

# Edit this file to introduce tasks to be run by cron.

# Each task to run has to be defined through a single line

# indicating with different fields when the task will be run

# and what command to run for the task

# To define the time you can provide concrete values for

# minute (m), hour (h), day of month (dom), month (mon),

# and day of week (dow) or use '*' in these fields (for 'any').# 

# Notice that tasks will be started based on the cron's system

# daemon's notion of time and timezones.

# Output of the crontab jobs (including errors) is sent through

# email to the user the crontab file belongs to (unless redirected).

# For example, you can run a backup of all your user accounts

# at 5 a.m every week with:

# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/

# For more information see the manual pages of crontab(5) and cron(8)

# m h  dom mon dow   command

10 * * * * ls > a.txt

~$


다음과 같이 다른 user의 crontab 파일을 작성할 수 있다.

~$ sudo crontab -eu root


현재의 crontab 파일을 삭제하려면 다음과 같다.

~$ crontab -r

~$


반응형
반응형

현재 user의 현재 shell에서 실행되는 process 목록

~$ ps

  PID TTY          TIME CMD

 3742 pts/0    00:00:00 bash

 3795 pts/0    00:00:00 ps

~$


특정 user의 실쟁중인 process 목록

~$ ps -u greenfish

  PID TTY          TIME CMD

 1809 ?        00:00:00 gnome-keyring-d

 1828 ?        00:00:00 gnome-session

 1861 ?        00:00:00 ssh-agent

...


특정 user의 실행중인 process 목록 (CPU, MEM)

~$ ps -u greenfish u

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

1000      1809  0.0  1.4  54064  7264 ?        Sl   11:45   0:00 /usr/bin/gnome-

1000      1828  0.0  1.4  35328  7248 ?        Ssl  11:45   0:00 gnome-session -

1000      1861  0.0  0.0   3368   188 ?        Ss   11:45   0:00 /usr/bin/ssh-ag

...


특정 user의 실행중인 process 목록 (PPID)

~$ ps -fu greenfish

UID        PID  PPID  C STIME TTY          TIME CMD

1000      1809     1  0 11:45 ?        00:00:00 /usr/bin/gnome-keyring-daemon --

1000      1828  1713  0 11:45 ?        00:00:00 gnome-session --session=ubuntu

1000      1861  1828  0 11:45 ?        00:00:00 /usr/bin/ssh-agent /usr/bin/dbus

...


특정 user의 실행중인 process 목록 (SZ, PSR)

~$ ps -Fu greenfish

UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD

1000      1809     1  0 13516  7264   0 11:45 ?        00:00:00 /usr/bin/gnome-k

1000      1828  1713  0  8832  7248   0 11:45 ?        00:00:00 gnome-session --

1000      1861  1828  0   842   188   0 11:45 ?        00:00:00 /usr/bin/ssh-age

...


모든 실행중인 process 목록

~$ ps -e

  PID TTY          TIME CMD

    1 ?        00:00:01 init

    2 ?        00:00:00 kthreadd

    3 ?        00:00:00 ksoftirqd/0

...


모든 실행중인 process 목록 (길게 보기)

~$ ps -el

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD

4 S     0     1     0  0  80   0 -   729 poll_s ?        00:00:01 init

1 S     0     2     0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd

1 S     0     3     2  0  80   0 -     0 run_ks ?        00:00:00 ksoftirqd/0

...


모든 실행중인 process 목록 (full format)

~$ ps -ef

UID        PID  PPID  C STIME TTY          TIME CMD

root         1     0  0 11:45 ?        00:00:01 /sbin/init

root         2     0  0 11:45 ?        00:00:00 [kthreadd]

root         3     2  0 11:45 ?        00:00:00 [ksoftirqd/0]

...


모든 실행중인 process 목록 (추가 full format)

~$ ps -eF

UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD

root         1     0  0   729  1820   0 11:45 ?        00:00:01 /sbin/init

root         2     0  0     0     0   0 11:45 ?        00:00:00 [kthreadd]

root         3     2  0     0     0   0 11:45 ?        00:00:00 [ksoftirqd/0]

...


모든 실행중인 process 목록 (단순 BSD style)

~$ ps ax

  PID TTY      STAT   TIME COMMAND

    1 ?        Ss     0:01 /sbin/init

    2 ?        S      0:00 [kthreadd]

    3 ?        S      0:00 [ksoftirqd/0]

...


모든 실행중인 process 목록 (BSD style)

~$ ps aux

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root         1  0.0  0.3   2916  1820 ?        Ss   11:45   0:01 /sbin/init

root         2  0.0  0.0      0     0 ?        S    11:45   0:00 [kthreadd]

root         3  0.0  0.0      0     0 ?        S    11:45   0:00 [ksoftirqd/0]

...

root      3301  0.0  0.1   3456   572 ?        S    15:57   0:00 dbus-launch --a

r

...


모든 실행중인 process 목록 (BSD style, 넓게 보기)

~$ ps auwx

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root         1  0.0  0.3   2916  1820 ?        Ss   11:45   0:01 /sbin/init

root         2  0.0  0.0      0     0 ?        S    11:45   0:00 [kthreadd]

root         3  0.0  0.0      0     0 ?        S    11:45   0:00 [ksoftirqd/0]

...

root      3301  0.0  0.1   3456   572 ?        S    15:57   0:00 dbus-launch --autolaunch=fb138e002267545c961db47100000006 --binary-syntax --close-stderr

...


모든 실행중인 process 목록 (BSD style, 무제한 넓게 보기)

~$ ps auwwx

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root         1  0.0  0.3   2916  1820 ?        Ss   11:45   0:01 /sbin/init

root         2  0.0  0.0      0     0 ?        S    11:45   0:00 [kthreadd]

root         3  0.0  0.0      0     0 ?        S    11:45   0:00 [ksoftirqd/0]

...


process의 hierachy를 tree 형태로 보기

~$ ps -ejH

  PID  PGID   SID TTY          TIME CMD

    2     0     0 ?        00:00:00 kthreadd

    3     0     0 ?        00:00:00   ksoftirqd/0

    6     0     0 ?        00:00:00   migration/0

...

    1     1     1 ?        00:00:01 init

  368   367   367 ?        00:00:00   upstart-udev-br

  373   373   373 ?        00:00:00   udevd

  566   373   373 ?        00:00:00     udevd

  567   373   373 ?        00:00:00     udevd

  774   773   773 ?        00:00:00   upstart-socket-

...

 1592  1592  1592 ?        00:00:00   gdm-binary

 1662  1592  1592 ?        00:00:00     gdm-simple-slav

 1667  1667  1667 tty7     00:00:26       Xorg

 1713  1592  1592 ?        00:00:00       gdm-session-wor

 1828  1828  1828 ?        00:00:00         gnome-session

 1861  1861  1861 ?        00:00:00           ssh-agent

 4495  1828  1828 ?        00:00:00   gnome-terminal

 4498  1828  1828 ?        00:00:00     gnome-pty-helpe

 4499  4499  4499 pts/0    00:00:00     bash

 4553  4553  4499 pts/0    00:00:00       ps

~$ 


process의 hierachy를 tree 형태로 보기 (BSD style)

~$ ps axjf

 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND

    0     2     0     0 ?           -1 S        0   0:00 [kthreadd]

    2     3     0     0 ?           -1 S        0   0:00  \_ [ksoftirqd/0]

    2     6     0     0 ?           -1 S        0   0:00  \_ [migration/0]

    2     7     0     0 ?           -1 S<       0   0:00  \_ [cpuset]

...

    1  1592  1592  1592 ?           -1 Ssl      0   0:00 gdm-binary

 1592  1662  1592  1592 ?           -1 Sl       0   0:00  \_ /usr/lib/gdm/gdm-si

 1662  1667  1667  1667 tty7      1667 Ss+      0   0:27      \_ /usr/bin/X :0 -

 1662  1713  1592  1592 ?           -1 Sl       0   0:00      \_ /usr/lib/gdm/gd

 1713  1828  1828  1828 ?           -1 Ssl   1000   0:00          \_ gnome-sessi

 1828  1861  1861  1861 ?           -1 Ss    1000   0:00              \_ /usr/bi

 1828  1895  1828  1828 ?           -1 Sl    1000   0:01              \_ metacit

...

    1  4558  1828  1828 ?           -1 Sl    1000   0:00 gnome-terminal

 4558  4561  1828  1828 ?           -1 S     1000   0:00  \_ gnome-pty-helper

 4558  4562  4562  4562 pts/0     4615 Ss    1000   0:00  \_ bash

 4562  4615  4615  4562 pts/0     4615 R+    1000   0:00      \_ ps axjf

~$


process의 hierachy를 tree 형태로 보기 (forest format)

~$ ps -ef --forest

UID        PID  PPID  C STIME TTY          TIME CMD

root         2     0  0 11:45 ?        00:00:00 [kthreadd]

root         3     2  0 11:45 ?        00:00:00  \_ [ksoftirqd/0]

root         6     2  0 11:45 ?        00:00:00  \_ [migration/0]

root         7     2  0 11:45 ?        00:00:00  \_ [cpuset]

...

root      1592     1  0 11:45 ?        00:00:00 gdm-binary

root      1662  1592  0 11:45 ?        00:00:00  \_ /usr/lib/gdm/gdm-simple-slav

root      1667  1662  0 11:45 tty7     00:00:28      \_ /usr/bin/X :0 -nr -verbo

root      1713  1662  0 11:45 ?        00:00:00      \_ /usr/lib/gdm/gdm-session

1000      1828  1713  0 11:45 ?        00:00:00          \_ gnome-session --sess

1000      1861  1828  0 11:45 ?        00:00:00              \_ /usr/bin/ssh-age

1000      1895  1828  0 11:45 ?        00:00:01              \_ metacity

...

1000      4617     1  2 17:30 ?        00:00:00 gnome-terminal

1000      4620  4617  0 17:30 ?        00:00:00  \_ gnome-pty-helper

1000      4621  4617  2 17:30 pts/0    00:00:00  \_ bash

1000      4675  4621  0 17:30 pts/0    00:00:00      \_ ps -ef --forest

~$


알파벳 순서로 tree 형태로 보기

~$ pstree

init─┬─NetworkManager─┬─dhclient

     │                └─2*[{NetworkManager}]

     ├─acpid

     ├─atd

...

     ├─gdm-binary─┬─gdm-simple-slav─┬─Xorg

     │            │                 ├─gdm-session-wor─┬─gnome-session─┬─applet.+

     │            │                 │                 │               ├─bluetoo+

     │            │                 │                 │               ├─evoluti+

     │            │                 │                 │               ├─gdu-not+

...

     └─zeitgeist-daemo─┬─cat

                       ├─zeitgeist-datah

                       └─{zeitgeist-daem}

~$


-o 옵션을 사용하면 표시할 column을 선택할 수 있다. --sort는 결과를 정렬한다. 다음은 -o에 사용 가능한 내용이다.


 Option

 Column

 설명

 %cpu

 %CPU 

 00.0 형태로 CPU 점유율 표시

 %mem

 %MEM

 물리 메모리 사용 % 

 args

 COMMAND

 명령의 argument 병행 표기

 bsdstart

 START 

 HH:MM 혹은 Mon Day 형식의 시작 시각 표시 

 bsdtime

 TIME 

 Total CPU Time 

 comm

 COMMAND 

 명령만 표기 (argument 표기 안함) 

 cp

 CP 

 000 형태(tenth-of-a-percent, 0~1000)로 CPU 점유율 표기

 cputime

 TIME 

 Total CPU Time [DD-]HH:MM:SS

 egid

 EGID 

 Effective group ID (정수)

 egroup

 EGROUP 

 Effective group ID (문자열)

 etime

 ELAPSED 

 시작후 경과시간 ([DD-]HH:MM:SS) 

 euid

 EUID 

 Effective user ID (정수) 

 euser

 EUSER 

 Effective user ID (문자열)

 fgid

 FGID 

 Fle system access group ID (숫자) 

 fgroup

 FGROUP

 File system access group ID (문자열) 

 fname

 COMMAND 

 명령의 첫 8글자 

 fuid

 FUID 

 File system access user ID (숫자) 

 fuser

 FUSER 

 File system access user ID (문자열) 

 lstart

 STARTED 

 명령이 시작된 시각 

 nice

 NI 

 Nice 값

 pgid

 PGID 

 Process group ID 

 pid 

 PID 

 Process ID 

 ppid 

 PPID 

 Parent process ID 

 psr

 PSR 

 Align된 Processor process (0~)

 rgid

 RGID

 Real group ID 

 rgroup

 RGROUP 

 Real group 

 rss

 RSS 

 Non-swapped physical memory (KB) 

 rtprio

 RTPRIO 

 Real-time priority 

 ruid

 RUID 

 Real user ID (정수) 

 ruser

 RUSER 

 Real user (문자열) 

 s

 S 

 상태 (D:sleep, no interrupt, R:running, S:sleep, can interrupt, T:stopped, W:paging, X:dead, Z:zombie) 

 sess

 SESS 

 Session ID 

 sgi_p

 P 

 프로세스가 실행중인 processor

 size

 SZ 

 대략적인 필요한 swap 공간 

 start

 STARTED

 명령이 시작된 시각.  HH:MM:SS 혹은 Month Day

 start_time

 START 

 명령이 시작된 시각. HH:MM 혹은 Month Day 

 stat

 STAT 

 "S"에 더해진 상태 (<:high priority, N:Low priority, L:page lock된 상태, s:session leader, l:multi-threaded, +:forground process) 

 sz

 SZ 

 프로세스의 core image 크기 (물리 크기) 

 tname

 TTY 

 제어중인 tty (terminal)

 user

 USER

 Effective user ID (문자열) 

 vsize

 VSZ 

 Process의 가상 메모리 (1024-byte 단위) 


메모리 사용량으로 정렬하려면 다음과 같다.

~$ ps -eo ppid,user,%mem,size,vsize,comm --sort=-size

 PPID USER     %MEM  SIZE    VSZ COMMAND

 1828 1000      5.6 48904 128216 nautilus

    1 1000      1.4 45156  54064 gnome-keyring-d

 1828 1000      2.9 43932 109744 gnome-panel

...

 1915 1000      0.0     0      0 zeitgeist-datah <defunct>

    2 root      0.0     0      0 kworker/0:0

    2 root      0.0     0      0 kworker/0:2

    2 root      0.0     0      0 kworker/0:1

~$


CPU 사용량으로 정렬하려면 다음과 같다.

~$ ps -eo ppid,user,bsdstart,bsdtime,%cpu,args --sort=-%cpu

 PPID USER      START   TIME %CPU COMMAND

    1 1000      09:38   0:00  0.8 gnome-terminal

 3859 1000      09:38   0:00  0.6 bash

 1662 root      05:05   0:28  0.1 /usr/bin/X :0 -nr -verbose -auth /var/run/gdm/

...

  952 root      09:18   0:00  0.0 /sbin/dhclient -d -4 -sf /usr/lib/NetworkManag

 3859 1000      09:38   0:00  0.0 gnome-pty-helper

 3863 1000      09:39   0:00  0.0 ps -eo ppid,user,bsdstart,bsdtime,%cpu,args --

~$


low priority로 정렬

~$ ps -eo ppid,user,nice,cputime,args --sort=-nice

 PPID USER      NI     TIME COMMAND

    2 root       5 00:00:00 [ksmd]

    1 rtkit      1 00:00:00 /usr/lib/rtkit/rtkit-daemon

    0 root       0 00:00:01 /sbin/init

...

    2 root     -20 00:00:00 [ext4-dio-unwrit]

    2 root     -20 00:00:00 [kpsmoused]

    2 root     -20 00:00:00 [vmmemctl]

~$


user 별로 정렬

~$ ps -eo ppid,user,stat,tname,sess,cputime,args --sort=user

 PPID USER     STAT TTY       SESS     TIME COMMAND

    1 daemon   Ss   ?         1063 00:00:00 atd

    1 1000     Sl   ?         1592 00:00:00 /usr/bin/gnome-keyring-daemon --daem

 1713 1000     Ssl  ?         1828 00:00:00 gnome-session --session=ubuntu

...

    2 root     S    ?            0 00:00:00 [kworker/0:1]

    1 rtkit    SNl  ?          880 00:00:00 /usr/lib/rtkit/rtkit-daemon

    1 syslog   Sl   ?          868 00:00:00 rsyslogd -c4

~$


rsyslogd process 표시

~$ ps -C rsyslogd

  PID TTY          TIME CMD

  879 ?        00:00:00 rsyslogd

~$


PID 879 표시

~$ ps -p 879 -o pid,ppid,bsdtime,args

  PID  PPID   TIME COMMAND

  879     1   0:00 rsyslogd -c4

~$


2명의 user process 표시

~$ ps -u root,greenfish -o pid,ruser,tty,stat,args

  PID RUSER    TT       STAT COMMAND

    1 root     ?        Ss   /sbin/init

    2 root     ?        S    [kthreadd]

    3 root     ?        S    [ksoftirqd/0]

...

 4113 1000     ?        S    gnome-pty-helper

 4114 1000     pts/0    Ss   bash

 4168 1000     pts/0    R+   ps -u root,greenfish -o pid,ruser,tty,stat,args

~$


top으로 활성화된 process 보기


다음과 같이 top을 실행하면,

~$ top


아래와 같이 프로세스가 display된다. (3초마다 refresh 된다)

~$ top


top - 09:47:20 up  4:41,  2 users,  load average: 0.00, 0.01, 0.05

Tasks: 131 total,   1 running, 129 sleeping,   0 stopped,   1 zombie

Cpu(s):  3.7%us,  0.3%sy,  0.0%ni, 95.7%id,  0.3%wa,  0.0%hi,  0.0%si,  0.0%st

Mem:    508000k total,   490844k used,    17156k free,   103252k buffers

Swap:   522236k total,      288k used,   521948k free,   182960k cached


  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            

 4171 greenfis  20   0 91268  13m  10m S  4.0  2.8   0:00.39 gnome-terminal     

 1667 root      20   0  166m  27m 7008 S  2.0  5.6   0:31.81 Xorg               

 4229 greenfis  20   0  2632 1140  860 R  0.7  0.2   0:00.05 top                

 1926 greenfis  20   0 95592  21m  17m S  0.3  4.3   0:15.85 vmtoolsd           

    1 root      20   0  2916 1756 1272 S  0.0  0.3   0:01.24 init               

    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd           

    3 root      20   0     0    0    0 S  0.0  0.0   0:00.10 ksoftirqd/0        

    6 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0        

    7 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 cpuset             

    8 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 khelper            

    9 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 netns              

   10 root      20   0     0    0    0 S  0.0  0.0   0:00.03 sync_supers        

   11 root      20   0     0    0    0 S  0.0  0.0   0:00.00 bdi-default        

   12 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kintegrityd        

   13 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kblockd            

   14 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kacpid             

   15 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kacpi_notify       



주기를 5초로 변경하려면 아래와 같이 실행한다.

~$ top -d 5


greenfish user로 실행되는 프로세스를 확인한다.

~$ top -u greenfish


두개의 process만 확인한다.

~$ top -p 4113,4114


10번 refresh하고 종료한다.

~$ top -n 10


interactive 화면을 실행하지 않는다. 지속적인 화면이 스크롤된다.

~$ top -b

top - 09:53:04 up  4:47,  2 users,  load average: 0.00, 0.01, 0.05

Tasks: 131 total,   1 running, 129 sleeping,   0 stopped,   1 zombie

Cpu(s):  0.3%us,  0.2%sy,  0.0%ni, 99.3%id,  0.2%wa,  0.0%hi,  0.0%si,  0.0%st

Mem:    508000k total,   491224k used,    16776k free,   103476k buffers

Swap:   522236k total,      288k used,   521948k free,   183048k cached


  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            

    1 root      20   0  2916 1756 1272 S  0.0  0.3   0:01.24 init               

    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd           

    3 root      20   0     0    0    0 S  0.0  0.0   0:00.11 ksoftirqd/0        

    6 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0        

...

 4242 greenfis  20   0  6936 3608 1528 S  0.0  0.7   0:00.11 bash               

 4298 greenfis  20   0  2628 1120  852 R  0.0  0.2   0:00.00 top                



top - 09:53:14 up  4:47,  2 users,  load average: 0.00, 0.01, 0.05

Tasks: 131 total,   3 running, 127 sleeping,   0 stopped,   1 zombie

Cpu(s):  2.7%us,  0.3%sy,  0.0%ni, 97.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Mem:    508000k total,   491224k used,    16776k free,   103484k buffers

Swap:   522236k total,      288k used,   521948k free,   183024k cached


  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            

 1667 root      20   0  166m  27m 7008 S  2.8  5.6   0:34.30 Xorg               

 4238 greenfis  20   0 91164  13m  10m R  2.1  2.8   0:01.15 gnome-terminal     

...


앞선 -b 옵션은 파일로 저장하기 용이하다. 다음은 10시간 간격의 프로세스 목록을 기록한다.

~$ top -b -n 1200 > process.log


만일 top 실행시, 즉각적인 refresh를 원한다면, space나 enter 키를 사용한다. shift+n은 PID로 정렬하며, shift+p는 CPU 사용량으로 정렬한다. shift+m은 memory 사용량으로 정렬한다. shift+t는 cpu time 소비시간으로 정렬한다. < 혹은 > 키로 정렬할 column을 변경한다. f 키를 눌러 정렬할 내용을 직접 선택할 수 있다.

d 키를 눌러 refresh time을 변경한다. u 키를 눌러 user를 변경한다. n을 눌러 확인할 프로세스의 개수를 지정한다. n 을 눌려 변경된 상태는 = 키를 눌러 원래대로 돌아온다.

k를 눌러 kill할 프로세스를 지정한다. r 키를 눌러 priority를 조절한다.(양수/음수)

반응형
반응형

# cat perf_log.sh
#!/bin/sh

# TPS

echo `date +%Y%m%d_%H%M` `iostat -d 1 2 | grep sd | egrep -v [a-z][0-9] | tail -n -120 | awk '{runq+=$2} ; END {print runq}'` >> /root/perf_log/log/TPS.log


# read io size

echo `date +%Y%m%d_%H%M` `vmstat 1 2 | tail -n 1 | awk '{print "read size: ", $9, "KB"}'` >> /root/perf_log/log/read_io.log

# write size

echo `date +%Y%m%d_%H%M` `vmstat 1 2 | tail -n 1 | awk '{print "write size: ", $10, "KB"}'` >> /root/perf_log/log/write_io.log


# cpu runq

echo `date +%Y%m%d_%H%M` `vmstat 1 2 | tail -n 1 | awk '{print "procs runq: ", $1}'` >> /root/perf_log/log/cpu_runq.log


# network

bond0_r1=`cat /proc/net/dev | grep bond0 | cut -c8- | awk '{print $1}'`
bond0_t1=`cat /proc/net/dev | grep bond0 | cut -c8- | awk '{print $9}'`
bond1_r1=`cat /proc/net/dev | grep bond1 | cut -c8- | awk '{print $1}'`
bond1_t1=`cat /proc/net/dev | grep bond1 | cut -c8- | awk '{print $9}'`


sleep 1
bond0_r2=`cat /proc/net/dev | grep bond0 | cut -c8- | awk '{print $1}'`
bond0_t2=`cat /proc/net/dev | grep bond0 | cut -c8- | awk '{print $9}'`
bond1_r2=`cat /proc/net/dev | grep bond1 | cut -c8- | awk '{print $1}'`
bond1_t2=`cat /proc/net/dev | grep bond1 | cut -c8- | awk '{print $9}'`
echo -e `date +%Y%m%d_%H%M` "Receive : $[($bond0_r2-$bond0_r1)/1024] KB/s  \t  Transmit : $[($bond0_t2-$bond0_t1)/1024] KB/s" >> /root/perf_log/log/network_bond0_traffic.log
echo -e `date +%Y%m%d_%H%M` "Receive : $[($bond1_r2-$bond1_r1)/1024] KB/s  \t  Transmit : $[($bond1_t2-$bond1_t1)/1024] KB/s" >> /root/perf_log/log/network_bond1_traffic.log



현재 S모 통신사에서 사용중인 성능정보 수집용 스크립트입니다. 1분 단위로 crontab에 넣고 쓰고 있네요.


아래는 Log 출력 형태 예시입니다. ^^

# cat cpu_runq.log
20101001_1324 procs runq: 10
20101001_1325 procs runq: 9
20101001_1326 procs runq: 6
20101001_1327 procs runq: 4
20101001_1328 procs runq: 13

# cat network_bond0_traffic.log
20101001_1324 Receive : 24737 KB/s        Transmit : 11292 KB/s
20101001_1325 Receive : 4480 KB/s         Transmit : 3737 KB/s
20101001_1326 Receive : 8322 KB/s         Transmit : 3293 KB/s
20101001_1327 Receive : 4436 KB/s         Transmit : 4646 KB/s
20101001_1328 Receive : 2141 KB/s         Transmit : 2243 KB/s

[root@mcwd_db1 log]# cat network_bond1_traffic.log
20101001_1324 Receive : 2165 KB/s         Transmit : 2438 KB/s
20101001_1325 Receive : 2202 KB/s         Transmit : 2514 KB/s
20101001_1326 Receive : 2574 KB/s         Transmit : 2863 KB/s
20101001_1327 Receive : 2976 KB/s         Transmit : 3143 KB/s
20101001_1328 Receive : 1510 KB/s         Transmit : 1737 KB/s

[root@mcwd_db1 log]# cat read_io.log
20101001_1324 read size: 101543 KB
20101001_1325 read size: 63079 KB
20101001_1326 read size: 54999 KB
20101001_1327 read size: 79167 KB
20101001_1328 read size: 44535 KB
20101001_1329 read size: 57747 KB

[root@mcwd_db1 log]# cat write_io.log
20101001_1324 write size: 4399 KB
20101001_1325 write size: 13337 KB
20101001_1326 write size: 13545 KB
20101001_1327 write size: 7307 KB
20101001_1328 write size: 9409 KB
20101001_1329 write size: 10605 KB

[root@mcwd_db1 log]# cat TPS.log
20101001_1324 8284
20101001_1325 7287
20101001_1326 8364.27
20101001_1327 6125
20101001_1328 6985
20101001_1329 8963


반응형
반응형

ssh로 코딩이나 작업을 하다 보면 파일업로드가 필요할 때가 있습니다.

그런 상황이면 거의 대부분 FTP 클라이언트를 열어서 업로드 해야하는 귀찮음을 감내해야합니다만...

xshell에선 드래그앤 드랍으로 처리할 수 있습니다.

간단하게 패키지를 하나 설치하면 됩니다.

apt-get install lrzsz

설치 한 후에는 ssh창에 업로드할 파일을 드래그 앤 드랍하면 끝.

혹시나 모르시는 분들을 위한 팁!

반응형
반응형

※ Linux 명령어 
 

uname -a     버젼정보보기

pwd         현재위치보기

cd           디렉토리 변경

ls <디렉토리>

- a : 모든 파일, 디렉토리 표시

- l : 디렉토리의 내용을 자세히 출력

- d : 디렉토리 정보 출력

- n : 정보 출력시 UID, GID 사용

- R : 하위 경로와 그 안에 모든 파일들도 표시

- F : 파일 형식 문자를 각 파일 뒤에 추가

* 실행파일 초록색

/ 디렉토리 파란색

@ 심볼링크파일 하늘색

| 파이프파일 주황색

= 소켓파일 자주색

NULL 정규파일 흰색(터미널), 검정색(프롬프트)

nl <파일>     numberline

vi -> :set nu   라인넘버보기

ls --help

mkdir -p <디렉토리/디렉토리>     하위디렉토리포함 만들기

rmdir <디렉토리>     디렉토리지우기

touch <파일>     파일만들기 또는 현재날자로 수정

clear         화면지우기

cp -f <파일> <파일>      //-f:묻지않음, -r:하위디렉토리포함

rm <디렉토리>     디렉토리지우기

- f : 강제삭제

- r : 하위 디렉토리 모두 삭제

- v : 파일 정보 출력

- i  : 삭제 여부 확인

mv <파일><디렉토리>      이동

- b : 덮어 쓰기 전 백업파일 생성

- u : 최근 파일일 경우에만 이동

- v : 파일 이동 과정을 보여줍니다

- f : 강제 덮어쓰기

ln <파일1> <파일2>     hardlink 2->1

ln -s <파일1> <파일2> softlink 2->1

echo $PATH      PATH보기

PATH=$PATH:\root/디렉토리     path추가

who am I     내정보보기

cat -n <파일>     라인번호

more, less      b: back, /단어: 검색

cat file1 > file2     redirection 표준출력

cat file1 >> file2     Append 추가

rpm -qa | grep <파일>     현재컴퓨터에 설치된 프로그램중 <파일>만출력

cal 월 년 | mail 주소     달력출력후 메일로 보내기

ps -ef | grep <파일>     실행중 프로세스중 <파일>만 출력

wc <파일>     라인 단어 문자 파일명

rpm -qa | wc -l     개수

bc     계산기

alias     별칭보기(ls -al == ll)

alias c='clear'     추가

history     !번호

useradd <계정>     계정추가

passwd <계정>      비밀번호

ps1='[\d  \t  \!] [\w]  \n  \\$'

    날짜 시간 명령어번호 현재경로 새로운라인

.bashrc     초기설정값저장, alias, ps1입력해서 전역변수화, 다음로그인시 설정값저장

 


ftp <주소>

ftp> pwd: server경로,     !pwd: client경로, !ls

ftp>get <파일>    다운로드

ftp>mget <*>    여러파일 다운로드

ftp>? <명령어>     설명

ftp>bye     끝

ftp>put <파일>     업로드

ftp>mput <a*>     여러파일 업로드

ftp>prompt      Interactive mode off/on

 


chsh -l     내시스템이 사용중인 쉘종류

cat -n /etc/shells

echo $SHELL     현재사용중인 쉘

env     환경변수 보기

chsh     /bin/ash(쉘종류)     shell change

gzip -1v <파일>     숫자클수록 압축률상승 속도저하

gunzip <파일>     파일명.gz 압축하기

tar xvfz <파일.tar.gz>     풀기

 


mount     현재마운트된 상태

df -h     파티션정보, 마운트정보

mount -t ext3 </dev/hda8> </apm>

mount -t iso9660 /dev/cdrom /mnt/cdrom/        cdrom마운트

umount </apm>

mkfs -t ext3 </dev/hda8>     파티션포멧

/etc/fstab     filesystem정보담긴 파일

/etc/inittab     runlevel 설정파일

  id:5:initdefault:     3:일반텍스트모드, 5:xwindow모드부팅

/etc/grub.conf     groub설정파일

vi -> se nu     번호붙이기

 


※ Kernel Compile

1. 커널 다운로드후 /usr/src  이동후 압축해제

2. /linux 이동

3. make mrproper     커널환경초기화

4. make xconfig/menuconfig

5. make dep     의존성 구축

6. make clean    필요없는 모듈제거

7. make bzImage     새로운 커널 이미지마듬

8. make modules

9. make modules_install

10. arch/i386/boot/bzImage  -> /boot로 이동

11. grub에서 설정

 


rpm -qa | grep ftp | wc -l

rpm -e --nodeps  <package name> 의존성무시 강제삭제

rpm -ivh <package name>   설치

rpm -Uvh     업그레이드

(core 먼저설치, standalone 나중설치)

 

/proc    시스템정보   meminfo, cpuinfo, swaps, interrupts, IRQ정보

top    현재 프로세스 사용상태 실시간

ps -A   실행중 프로세스     -ef 자세히

pstree

killall <프로세스이름>   프로세스 죽이기

 


useradd <계정>

passwd <계정>

/etc/passwd

/etc/shadow

finger <계정>   정보보기

chfn <계정>    정보수정

usermod -s(쉘변경) /bin/zsh(쉘위치) <계정> ;   -g(그룹변경) <그룹명> <계정>

userdel -r <계정>     homedirectory삭제

/etc/group

groupadd <그룹명>

/etc/default/useradd     홈디렉토리변경가능

useradd -G <그룹> <계정>

groups <계정>     이계정의 소속그룹 확인

chgrp <그룹명> <디렉토리>     디렉토리 소유그룹을 <그룹명>으로 변경

chown <계정명> <파일명>

chown <계정.그룹> <파일> 계정,그룹동시변경 가능

chmod 777 <파일>   r:4, w:2, x:1

 

gcc -o <만들파일이름> <소스파일.c>

./configure   (--prefix=/디렉토리)   (기본=/usr/local)

make   컴파일

make clean   에러발생시

make install

 
shutdown -h now   (-r: reboot)

 


host -l <domain name>   그 도메인의 IP주소출력

traceroute microsoft.com

 

find / -name "filename"    (-perm, -user)

find . -name "*.txt" | xargs grep [-option] hello   -> hello문자열을 포함한 파일 찾기

[option]

-l: 파일리스트만 보여주기, -i: 찾는 문자열 대소문자 구분하지 않기, -r: find쓰지 않고 특정디렉토리 이하 모두 검색

 

which <명령어>

whereis <명령어>

 

/var/log/dmesg     ->커널이 부팅시 하드웨어 검색하는 메세지

/var/log/messages   ->커널과 시스템에 관련된 로그 메세지

 

service networ [옵션]

redhat-config-network

ifconfig

vi /etc/sysconfig/network     기본 호스트에 대한 정보

vi /etc/sysconfig/network-scripts/ifcfg-eth0     이더넷카드설정

vi /etc/resolv.conf          DNS설정

 

/etc/init.d/network restart   (또는 /etc/rc.d/init.d/network)   네트워크재시작

 

반응형
반응형


# vi /etc/bashrc 에 alias vi=vim 을 꼭 추가한다.


# vi /etc/vimrc

아래 내용 추가(전체)


#vi ~/.vimrc

각각의 계정 설정


let g:MultipleSearchMaxColors = 8 


hi Search0 ctermbg=blue guibg=blue ctermfg=white guifg=white 

hi Search1 ctermbg=green guibg=green ctermfg=black guifg=black 

hi Search2 ctermbg=magenta guibg=magenta ctermfg=white guifg=white 

hi Search3 ctermbg=cyan guibg=cyan ctermfg=black guifg=black 

hi Search4 ctermbg=brown guibg=brown ctermfg=white guifg=white 

hi Search5 ctermbg=gray guibg=gray ctermfg=black guifg=black 

hi Search6 ctermbg=red guibg=red ctermfg=white guifg=white 

hi Search7 ctermbg=yellow guibg=yellow ctermfg=black guifg=black 


map <F1> :wq<cr>

map <F2> :wq<cr>

map <F3> :w<cr>

map <F4> :q<cr>


map <F5> :w!<CR>:!gcc %<CR>:!./a.out<CR>

map <F6> :w!<CR>:!g++ %<CR>:!./a.out<CR>


"map <F5> :w!<cr>:!gcc % -o %< -lncurses && ./%< <cr>

"map <F6> :w!<cr>:!gcc % -o %< && ./%< <cr>


map <F9> :q!<cr>

"map <F6> v]}zf

"map <F7> zo



set number "line number

set ai

set tabstop=4   "tab키설정

syntax on "구문강조 사용

set background=dark "하이라이팅

set ruler "커서의 줄,칸 위치표시

set title

set ignorecase "검색시 대소문자 무시

set hlsearch "검색어 강조

set cindent "C프로그래밍용 자동 들여쓰기

set smartindent "스마트한 들여쓰기

set autoindent " 자동 들여쓰기

set showmode " 현재 모드를 보여줌

set shiftwidth=4  "자동 들여서기 할때 여백(sw=4)

set showmatch   "괄호를 맞춰주는 부분(set sm)

set history=50 " vi 편집기록 기억갯수

"set visualbell " 키를 잘못눌렀을 때 화면 프레시

set showcmd " display incomplete commands

set incsearch "키워드 검색시 점진적 검색

"colorscheme desert  "  vi 색상 테마 설정

set bs=indent,eol,start "백스페이스 사용



반응형

'연구개발 > Linux' 카테고리의 다른 글

ssh 파일 업로드  (0) 2014.05.22
Linux 명령어  (0) 2014.05.11
rpm 명령어  (0) 2014.05.09
[Linux] CPU, I/O, Memory 사용량 측정  (0) 2014.05.09
[UNIX/LINUX] Shell Script 기본 - 5.case문 (1) 기본 사용법 및 예제  (0) 2014.05.04
반응형

* 가장 많이 사용하는 - 설치하기 옵션!

   : rpm -Uvh 패키지파일이름 : 업그레이드(기존의 것을 삭제하고 설치)하며 그 과정을 자세히 보여준다.


* 가장 많이 사용하는 - 삭제하기 옵션!

   : rpm -e 패키지이름 : 설치된 패키지의 삭제. 버전번호등을 제외하고 패키지의 이름만 적어준다.


* 일반 패키지 설치

   : rpm -i 패키지파일이름 : 설치한다. (기존의 것 삭제 안함)


* 업그레이드

   : rpm -U 패키지파일이름 : 업그레이드한다. 업그레이드 과정을 자세히 보여주지 않는다.


* 설치 거부할 경우 강제 설치하기

   : rpm -Uvh 패키지파일이름 --force : 동일하거나 더 높은 버전의 패키지가 

     이미 설치되어 있는 경우라도 강제로 기존의 것을 삭제하고 설치한다.


* 의존성을 무시하고 설치하기

   : rpm -Uvh 패키지파일이름 --nodeps : 의존관계에 있는 다른 패키지가 설치되어 있지 않다해도 강제 설치한다.


* 의존성과 버전을 무시하고 강제설치하기

   : rpm -Uvh 패키지파일이름 --nodeps --force : 걸림없이 무조건 설치!


* 의존성 무시하고 삭제하기

   : rpm -e 패키지이름 --nodeps : 이 패키지를 필요로 하는 다른 패키지가 있더라도 무시하고 패키지를 삭제한다.


* 테스트만 해보기

   : rpm [설치/삭제 등의 옵션들] --test : 실제로 작업을 하지 않고 작업 결과에 대한 테스트만 해볼 때 사용한다.


* 설치된 모든 패키지 보기

   : rpm -qa : 모든 패키지 리스트 출력

   : rpm -qa | wc -l : 총 설치된 패키지 개수 출력


* 설치된 패키지의 정보 보기

   : rpm -qi 패키지이름


* 특정 패키지가 포함하고 있는 파일 목록은?

   : rpm -ql 패키지이름


* 패키지 파일이 포함하고 있는 파일 목록은?

   : rpm -qlp 패키지파일이름


* 이 파일은 어느 패키지에 포함된 걸까?

   : rpm -qf 파일이름


* 패키지 파일에서 패키지 정보 출력

   : rpm -qip 패키지파일이름


* 패키지 검사하기

   : rpm -V 패키지이름 : 설치된 패키지 검사하기. 설치 후 어떤 파일이 어떻게 바꼈는지 알 수 있다.


* 의존성에 문제있는 패키지는?

   : rpm -Va --nofiles : 설치된 모든 패키지를 검사하여 의존성에 문제가 있는 것을 찾아낸다

반응형
반응형
  1. iostat

    1. 별도의 설치 필요없음, 물리적 드라이버 별로 기본적인 Disk Read/Write 볼 수 있음
    2. 한 개 이상의 디스크 드라이브에 대한 입출력 통계와 CPU 활용량

      arg-cpu
      %user
      %nice
      %system
      %iowait
      %steal
      %idle
      마지막 재부팅 이후의 평균 CPU 활용량어플리케이션 등 사용자 모드에 소모된 시간nice를 사용하여 스케줄링 우선순위가 바뀐 프로세스에 소모된 시간시스템(커널)이 사용한 시간디스크I/O 요청 때문에 CPU가 대기한 시간다른 가상 CPU가 서비스하는 동안 비자발적으로 대기한 시간대기한 시간
      Device
      tps
      kB_read/s
      kB_wrtn/s
      kB_read
      kB_wrtn
      디바이스 구분초당 전송(입출력) 수초당 읽혀진 KB (Blk일 경우 512바이트 블록수)초당 쓰여진 KB (Blk일 경우 512바이트 블록수)지금까지 읽혀진 KB(Blk일 경우 512바이트 블록수)지금까지 쓰여진 KB(Blk일 경우 512바이트 블록수)
  2. vmstat
    1. 별도의 설치 필요없음, 시스템의 리소스 상황(CPU, I/O, Memory)을 모니터링 할 수 있음 (http://jikime.tistory.com/286)

    2. vmstat(옵션없음) - 마지막 부팅 이후의 평균값

    3. vmstat 2 10 => 2초 간격으로 10회 정보 갱신

      procsmemoryswapiosystemcpu
      rbwswpdfreebuffcachesisobiboincsussyidwa
      현재 실행중인 프로세스의 수(CPU 접근 대기 중인 실행 가능 프로세스 수)인터럽트가 불가능한 sleep 상태에 있는 프로세스의 수 (I/O 처리를 하는 동안 블럭 처리된 프로세스)강제로 스왑아웃된 프로세스사용하고 있는 swap 메모리 양(사용된 가상 메모리 용량)사용가능한 메모리 양버퍼로 사용되고 있는 메모리 양캐시로 사용되고 있는 메모리 양swap in(디스크에서 메모리로 스왑된 메모리 용량)swap out(디스크로 스왑되어 나간 메모리 용량)초당 블럭 디바이스로 보내는 블럭 수(블록 장치로 보내진 블록)초당 블럭 디바이스로부터 받은 블럭 수(블록 장치에서 받아온 블록)초당 인터럽트 되는 양초당 context switch되는 양사용자의 CPU 사용 시간 비율(CPU가 사용자 수준 코드를 실행한 시간, 백분율 단위)시스템의 CPU 사용 시간 비율(CPU가 시스템 수준 코드를 실행한 시간, 백분율 단위)CPU idle time(백분율 단위)입출력 대기
  3. top
    1. 별도의 설치 필요없음, CPU 점유 프로세스들을 실시간으로 조회하는 명령어 (http://weezzle.net/1360)

    • 1줄 top : 시스템의 전반적 상태(가동시간 등)

    • 2줄 Tasks : 프로세스들의 상황

    • 3줄 CPU : CPU의 상황

    • 4줄 Mem : 메모리 상황

    • 5줄 Swap : 스왑 메모리 상황

    • 6줄

      PID
      USER
      PR
      NI
      VIRT
      RES
      SHR
      S
      %CPU
      %MEM
      TIME+
      COMMAND
      프로세스 ID프로세스를 실행시킨 사용자 ID프로세스의 우선순위NICE 값가상 메모리의 사용량(SWAP+RES)현재 페이지가 상주하고 있는 크기(Resident Size)분할된 페이지, 프로세스에 의해 사용된 메모리를 나눈 메모리의 총합프로세스의 상태(Sleeping, Running, sWapped out process, Zombies)프로세스가 사용하는 CPU의 사용율프로세스가 사용하는 메모리의 사용율CPU TIME, hundredths실행된 명령어
  4. free
    1. 시스템의 실제메모리와 스왑메모리에 대한 사용현황을 확인할 수 있는 명령어 (http://blog.naver.com/PostView.nhn?blogId=jwmoon74&logNo=100174011942)
    • 1줄 Mem : 시스템의 물리적인 메모리에 대한 사용량을 각 필드 단위로 표시

      total
      used
      free
      shared
      buffers
      cached
      전체 메모리의 용량으 Kbyte단위(default)로 표시현재 시스템에서 사용중인 메모리의 량을 Kbyte 단위로 표시현재 시스템에서 사용중이지 않은 메모리의 량을 Kbyte단위로 표시현재 시스템에서 공유한 메모리의 용량을 표시현재 시스템에서 buffering된 메모리의 량을 표시현재 시스템에서 caching된 ㅣ메모리의 량을 표시
    • 2줄 -/+ buffers/cache : 현재 캐시 메모리에서 버퍼링된 사용량을 표시(used/free)
    • 3줄 Swap : 서버설치 시에 결정한 스왑메모리의 량, 스왑메모리는 디스크의 일부분을 메모리로 잡아서 설정되기 때문에 스왑메모리가 많이 사용되고 있다는 것은 시스템의 전체적인 속도가 떨어진다는 것을 의미하며 지속적으로 스왑메모리가 사용된다는 것은 결국 실제 메모리를 증설해야 한다는 것이다.

      total
      used
      free
      시스템의 전체 스왑메모리의 량을 표시전체 스왑메모리 중에서 현재 사용중인 스왑메모리의 량을 표시전체 스왑메모리중에서 사용되지 않고 남아 있는 메모리의 량
  5. iotop
    1. 별도의 설치 필요함, Python 2.5+, linux kernel 2.6.20+ 이 2개의 프로그램이 기본적으로 설치되어 있어야 함

      TIDPRIOUSERDISK READDISK WRITESWAPINIOCOMMAND


CPU - perf, top, htop

Memory - valgrind, smem

Disk I/O - nmon, bonnie, sysstat

Network - netperf, iftop, netstat



반응형
반응형

안녕하세요, 박현명입니다..

 

이번 글은 case 문에 대한 기본 사용법과 예제에 대해 알아보겠습니다..

 

5. case문

 

(1) 기본 사용법 및 예제

case 변수 in

     경우1)

             ~

             ;;

     경우2)

             ~

             ;;

     경우3)

             ~

             ;;

             ...

esac

 

case문의 사용법은 아주 간단합니다..

 

shell script를 아무 생각없이 코딩하다 보면 무수히 많은 if문을 남발하게 되고 소스 자체가 지저분해 보이게 되는데 이 때 이 case문만 적절히 사용할 줄 알아도 훨씬 심플하고 보기 좋은 shell script를 작성할 수 있습니다..

 

그럼 바로 예제문을 통해 설명 드리겠습니다..

 

먼저 동일한 결과를 보여주는 if문부터 보도록 하겠습니다..

tmpSize=`df -g /tmp | grep tmp | awk '{print $3}' | cut -d '.' -f 1`
echo 'The size of /tmp filesystem '${tmpSize}' GB'

 

if [ ${tmpSize} -eq 0 ]; then

    chfs -a size=+2G /tmp

    echo 'The size of /tmp filesystem is increased 2GB.'

elif [ ${tmpSize} -eq 1 ]; then

    chfs -a size=+1G /tmp

    echo 'The size of /tmp filesystem is increased 1GB.'

else

    echo 'The size of /tmp filesystem is equal or greater than 2GB.'

fi

예문이 짧아서 if문이나 case문이나 별차이 없어 보이기도 합니다만, 그래도 아래 case문이 더 깔끔해 보이지 않나요?;;;;

  tmpSize=`df -g /tmp | grep tmp | awk '{print $3}' | cut -d '.' -f 1`
  echo 'The size of /tmp filesystem '${tmpSize}' GB'
  
  case ${tmpSize} in
     0)
        chfs -a size=+2G /tmp
        echo 'The size of /tmp filesystem is increased 2GB.'
        ;;
     1)
        chfs -a size=+1G /tmp
        echo 'The size of /tmp filesystem is increased 1GB.'
        ;;
     *)
        echo 'The size of /tmp filesystem is equal or greater than 2GB.'
        ;;
  esac

위 예제는 AIX에서 /tmp 파일시스템의 사용 가능 용량(free size)에 비추어 파일시스템 크기를 2GB 이상으로 늘려주려는 case문 예제입니다..

 

먼저 첫 번째줄의 명령 구문은 /tmp 파일시스템의 정보를 GB 단위로 가져온 후(df -g /tmp), 제일 윗 줄의 불필요한 row 부분을 제거하고(grep tmp), 세 번째 컬럼인 Free size 정보만 뽑아낸 다음(awk '{print $3}'), 소수점 이하 자리는 제외하고 정수 부분의 값만 가져오겠다(cut -d '.' -f 1)는 뜻입니다..

 

<참조 - AIX 에서의 df 명령 실행 결과 화면>



 

 

위 화면과 같은 상황에서 첫 번째 명령구문을 실행하였다면 output으로 '1'을 반환하겠죠?

 

그렇다면 case문의 ${tmpSize} 변수값에 '1'이 넘어갈 것이고 변수가 '1'일 경우에 실행되는 구문인 'chfs -a size=+1G /tmp' 가 실행될 것입니다..

 

case문에 보이는 '*'(asterisk) 같은 경우는 if문의 else와 같은 용도라고 보시면 되는데요..

 

위 예제에 비추어 설명 드리자면, ${tmpSize} 변수값이 0도 아니고 1도 아닐 경우엔 별다른 명령문 수행없이 echo문만 수행하겠다는 내용이지요..

 

아주 간단하죠?

 

이상 case문에 대한 기본 사용법 및 예제에 대해서 말씀 드렸습니다..

 

감사합니다..


반응형
반응형

안녕하세요, 박현명입니다..

 

이번 글은 for문에 이어 그와 유사하게 사용할 수 있는 while문에 대해서 알아보도록 하겠습니다..

 

4. while문

 

(1) 기본 사용법 및 예제

while [ 조건식 ]; do       // while문 시작

    ~

done                            // while문 종료

for문과 마찬가지로 while문 또한 루프 처리를 담당합니다..

 

사용법이 다소 다르므로 상황에 따라 적절히 선택해서 사용해야 하는데요..

 

이 while문 역시 조건식 뒤에 세미콜론을 사용하지 않고 사용 가능합니다..

 

while문의 조건식엔 보통 산술 비교 형태가 들어갑니다..

 

가령, 다음과 같은 식이지요..

while [ ${index} -le 10 ]      // index 변수값이 10보다 작거나 같은 동안 while문 수행

do

   ~

done

위와 같은 조건식으로 시작하여 '~' 로 처리한 컨텐츠 부분에 그 조건식에 위배되는 순간이 오게 되면 while문을 종료하는 식이지요..

 

헌데 for문이든 while문이든 아주 중요한 것이 있습니다..

 

아실 만한 분들은 다 아시겠지만 바로 무한루프에 빠지는 경우를 방지해야 한다는 건데요..

 

이런 무한루프 방지를 위해 continue 나 break 문을 적절하게 사용해야 합니다..

 

또한, 내가 원하는 결과값을 이미 얻었음에도 불구하고 while문을 계속 수행해야할 필요는 없겠죠?

 

그렇게 되면 불필요하게 시스템의 리소스를 잡아먹게 되고 성능이 느려지게 됩니다..

 

바로 그럴 때 break 나 continue 문을 사용하는 건데요..

 

다음 예제를 한 번 보시죠..

index=1

 

while [ ${index} -le 1000 ]; do    // index 값이 1000보다 작을 때까지 while문 수행

 

    if [ ${index} -eq 10 ]; then       // index 값이 10과 같으면

        age=$((index + 20))            // age 변수에 (index 값 + 20)의 결과값을 할당

    fi

    index=$((index + 1))               // index 값 1 증분

 

done

 

echo 'I am '${age}' years old.'

위 예제를 보시면 결국 내가 원하는 값은 제일 마지막 줄에 echo 커맨드를 통하여 age 값을 포함한 한 문장을 출력하는 것이란 걸 알 수 있습니다..

 

허나, break 문이 존재하지 않기 때문에 index에 10이 할당되고 난 이후에도 while문을 계속 수행할 수밖에 없는 구조로 되어 있습니다..

 

이럴 때 다음과 같이 break 문을 사용하면 시스템 부하도 줄일 수 있고 응답 시간도 줄일 수 있습니다..

index=1

while [ ${index} -le 1000 ]; do    // index 값이 1000보다 작을 때까지 while문 수행

     if [ ${index} -eq 10 ]; then     // index 값이 10과 같으면

         age=$((index + 20))          // age 변수에 (index 값 + 20)의 결과값을 할당

         break                               // 원하는 값을 얻었으므로 while문을 빠져나감 

     fi

     index=$((index + 1))             // index 값 1 증분

done

echo 'I am '${age}' years old.'

위와 같이 for문이든 while문이든 루프 제어문에서 break 나 continue 를 적절히 사용해 주시면, 무한루프도 방지할 수 있고 시스템 부하도 줄일 수 있습니다..(일종의 shell script 튜닝 포인트죠..)

 

이상 while문에 대한 기본 사용법 및 예제였습니다..

 

다음 시간에는 case문에 대한 사용법에 대해 말씀 드리도록 하겠습니다..

 

감사합니다..


반응형
반응형

안녕하세요, 박현명입니다..

 

이번 글은 지난 글에서 설명 드렸던 for문을 이용한 예제 스크립트를 보여 드리고 for문에 대해서 좀 더 이해할 수 있는 시간을 갖도록 하겠습니다..

 

먼저 예제 스크립트 전문입니다..

#!/bin/sh

if [ -d $1 ]; then

        cd $1


        if [ -f $2 -a -s $2 ]; then


                echo $2' is file and has contents more than one character.'

 

                array=`cat $1/$2`

 

                for day in ${array}; do

                    if [ -n ${day} ]; then

                        if [ ${day} == "Fri" -o ${day} == "Sat" ]; then

                            echo ${day}' is very happy day!!'
                        else
                            echo ${day}' is gloomy day.'

                        fi
                    fi

                done


        else
                echo $2' is not file or has zero character.'
        fi

fi

앞서 if문 예제 글에서 보여 드렸던 예제 스크립트보단 짧은 스크립트이지만 설명의 편의를 위해 크게 if문과 for문으로 나누어 설명 드리도록 하겠습니다..

 

1) 첫 번째 섹션 - if문

if [ -d $1 ]; then                             // 첫 번째 매개변수 값이 디렉토리라면,

        cd $1                                     // 해당 디렉토리로 이동


        if [ -f $2 -a -s $2 ]; then        // 두 번째 매개변수 값이 파일(-f)이고 그 파일이 내용을 가지고 있다면(-s),


                echo $2' is file and has contents more than one character.'

 

                array=`cat $1/$2`       // array라는 변수에 두 번째 매개변수인 파일에서 읽어들인 내용을 할당

 

                for day in ${array}; do      // for문 시작

                    ~

                done                                  // for문 종료


        else                     // 두 번째 매개변수 값이 파일이 아니거나 그 파일이 아무런 내용도 가지고 있지 않다면,
                echo $2' is not file or has zero character.'
        fi

fi

라인별 설명은 위 내용을 참조하시면 되겠고,

 

if문의 내용을 한 문장으로 표현하자면,

 

두 번째 매개변수 값이 파일이고 내용을 가지고 있을 경우엔 for문을 실행시켜 원하는 결과를 얻을 것이고, 그렇지 않다면 echo로 그에 대한 내용만 화면에 보여주겠다는 것입니다..

 

if문과 관련해선 앞선 글들에서 자세히 설명해 놓았으니 참고하시면 될 것 같습니다..

 

2) 두 번째 섹션 - for문

for day in ${array}; do

    if [ -n ${day} ]; then

        if [ ${day} == "Fri" -o ${day} == "Sat" ]; then

            echo ${day}' is very happy day!!'
        else
            echo ${day}' is gloomy day.'

        fi
    fi

done

array라는 변수에 할당된 값이 파일이고 내용을 가지고 있다는 if문을 통과하였다면 for문을 실행하겠죠?

 

그렇다면 이 array 변수를 for문에 집어넣고 이제 띄어쓰기 단위로 구분된 단어 하나하나를 끄집어 내어 day라는 변수에 할당합니다..

 

if문 안의 -n 옵션은 변수의 내용이 null이 아닌지를 판별하는 옵션이므로 day에 할당된 변수값이 null일 경우, 즉 파일의 끝에 도달했을 경우에는 if문을 실행하지 않겠죠..

 

그 다음 if문은 굳이 설명 드리지 않아도 아실 거라 생각됩니다..

 

물론 위 스크립트를 실행시키려면 다음과 같은 샘플 파일이 OS 디렉토리 어딘가에 존재해야만 스크립트 실행 시 매개변수로 넣어줄 수 있겠죠..

# cat /tmp/test.txt

Sun Mon Tue Wen Thu Fri Sat

그리고 다음과 같이 실행시키시면 됩니다..

./ForTest.sh /tmp ForTestResult.txt

이상 for문에 대한 간단한 예제였습니다..

 

감사합니다..


반응형
반응형

안녕하세요, 박현명입니다..

 

이번 글은 Shell Script에서 아주 유용하게 사용되는 for문에 대한 내용입니다..

 

3. for문

 

(1) 기본 사용법

for 단일변수 in 리스트; do    // for문 시작

    ~

done                                  // for문 종료

for문의 용도에 대한 것을 모르시는 분은 없을 겁니다..

 

C, Java 등 많은 language들에서 while문과 함께 가장 많이 쓰이는 루프 처리 구문이 바로 이 for문이기 때문이죠..

 

위 구문에서도 if문 처리에서 보았던 것처럼 세미콜론을 볼 수가 있는데, 마찬가지로 세미콜론을 사용하지 않으려면 다음과 같은 형태로 처리해야 합니다..

for 단일변수 in 리스트      // for문 시작

do

    ~

done                             // for문 종료

'리스트' 자리에는 보통 배열 형태로 들어가게 되는데요..

 

'리스트' 자리의 배열은 일일이 값을 나열할 수도 있고 배열 형태의 값을 가진 파일을 읽어들이는 형태일 수도 있습니다..

 

우선 '리스트'에 일일이 값을 나열하는 방법을 이용한 for문의 예시를 보도록 하겠습니다..

for day in Sun Mon Tue Wen Thu Fri Sat; do

    echo $day

done

위 예제는 '리스트' 자리에 요일 이름을 나열하여 'Sun'부터 'Sat'까지 하나씩 'day'라는 변수에 input값으로 들어가고 echo를 통해 화면에 뿌려지는 예제입니다..

 

그럼 이번에는 '리스트'에 배열 형태의 값을 가진 파일을 읽어들이는 방법을 살펴볼까요?

 

먼저 다음과 같은 값을 가진 파일이 있다고 가정합니다..

# cat test.txt

Sun Mon Tue Wen Thu Fri Sat

그리고 위 파일을 '리스트' 부분에 넣어보겠습니다..

for day in $(cat test.txt); do

    echo $day

done

위 예제는 test.txt 파일의 값을 읽어들여 'day' 변수에 하나씩 input값으로 들어가게끔 하는 것인데요..

 

위 예제처럼 '리스트' 부분에 cat 커맨드를 사용하여 바로 파일을 읽어들일 수도 있고 또는 다음과 같이 사용할 수도 있습니다..

array=`cat test.txt`

 

for day in $array; do

    echo $day

done

`(back quotation)은 어떤 shell command의 실행 결과를 '=(equal)' 좌측의 변수에 할당하고자 할 때 사용합니다..

 

위와 같이 처리하면 앞서 '리스트' 부분에서 바로 cat 커맨드를 사용한 것과 동일한 결과를 가져올 수 있습니다..

 

이상 for문에 대한 기본 사용법 및 간단한 예제들을 살펴보았습니다..

 

다음 글에서는 for문과 if문을 사용한 예제에 대해서 말씀 드리도록 하겠습니다..

 

감사합니다..


반응형
반응형

안녕하세요, 박현명입니다..

 

Shell Script에 대한 여섯 번째 글입니다..

 

이번 글에서는 배열에 관하여 말씀 드리도록 하겠습니다..

 

(3) 배열

 

배열을 선언하여 값을 할당하는 방법에는 크게 두 가지 정도가 있습니다..

 

하나는 배열의 인덱스 하나하나를 구분하여 각각의 인덱스에 일일이 값을 지정하는 방법과, 또 다른 하나는 뭉탱이로 배열에 값을 넣어주는 방법입니다..

 

먼저 인덱스 하나하나에 값을 따로따로 지정하는 방법은 다음과 같습니다..

array[0]='Shell'

array[1]='Script'

array[2]='Programming'

위 예제의 경우, 인덱스 '0'에는 'Shell'이란 문자열이, 인덱스 '1'에는 'Script'란 문자열이, 인덱스 '2'에는 'Programming'이란 문자열이 각각 지정되었습니다..

 

위와 같이 지정한 후, 다른 라인에서 해당 배열 변수값을 호출하고자 할 때는 아래와 같이 사용하면 됩니다..

echo ${array[0]}

echo ${array[1]}

버퍼에 있는 변수값을 호출하려 할 때, '$'를 붙여서 사용하면 된다는 것은 앞의 글에서 이미 설명 드렸었습니다..

 

헌데, 위 예시에는 그동안 사용하지 않았던 '{ }'(중괄호)가 들어가 있죠?

 

왜일까요?

 

다음과 같은 아주 간단한 스크립트가 있습니다..

#!/bin/sh

array[0]='Shell'
array[1]='Script'

 

echo $array[0] $array[1]

echo ${array[0]} ${array[1]}

위 스크립트를 실행시키면 첫 번째 echo 문의 결과값은 'Shell[0] Shell[1]' 이라고 출력되고, 두 번째 echo 문의 결과값은 'Shell Script'라고 출력됩니다..

 

이유인즉슨, '{ }'(중괄호)를 사용하여 array[0], array[1] 등을 하나의 변수로 처리해 주지 않으면, [0], [1] 등을 인식하지 못하고 해당 배열의 첫 번째 인덱스값만 불러오게 되어 있기 때문입니다..

 

꼭 배열을 사용할 때 뿐만 아니라, 많은 경우에서 '{ }'(중괄호)를 필요로 하게 됩니다..

 

'이것은 변수다'라는 것을 명시적으로 표기하여 소스의 가독성을 높이고자 한다면, 변수 호출 시마다 '{ }'(중괄호)를 붙여주는 것이 좋습니다..

 

다음은 뭉탱이로 배열에 값을 할당하여 주는 방법입니다..

 

뭉탱이로 배열에 값을 할당하는 방법도 몇 가지가 있는데, 그 중 사용이 쉽고 자주 쓰이는 두 가지 방식만 살펴보도록 하겠습니다..

 

첫 번째 방식은 다음과 같습니다..

array=(shell script programming)

일일이 값을 할당하는 방식에 비해 훨씬 간결하죠?

 

배열의 인덱스마다 일일이 값을 할당하나, 괄호를 사용하여 한 번에 할당하나 변수 호출의 결과는 같습니다..

 

또 다른 뭉탱이 할당 방식은 파일을 읽어들이는 것입니다..

 

다음 예제를 보시죠..

# cat test.txt

shell script programming

 

array=$(cat test.txt)

echo ${array[0]}

위와 같이 'shell script programming' 이라는 문자열을 담고 있는 파일이 있다면, shell 커맨드인 'cat' 을 이용하여 값을 불러와 배열에 할당할 수 있습니다..

 

Shell Script를 짜다 보면 여러 파일에서 값을 불러와 배열에 저장하고 사용하는 경우가 종종 생기는 데 그 때 위 예제처럼 사용하면 됩니다..

 

그리고 이전에도 한 번 강조했던 내용이지만, 배열 변수에 값을 할당할 때도 '='(equal) 앞뒤로 절대 공백이 존재하면 안된다는 것을 명심하시기 바랍니다..

 

별로 어렵지 않죠?

 

이상으로 Shell Script의 기본이 되는 문법 몇 개를 살펴보았고, 다음 시간부터는 for문의 사용법에 대해서 알아보도록 하겠습니다..

 

감사합니다..


반응형
반응형

안녕하세요, 박현명입니다..

 

Shell Script에 대한 다섯 번째 글을 올립니다..

 

이번 글에서는 스크립트 작성의 가장 기초가 되는 변수 선언 및 value 할당, 수치 계산, 문자열 배열 처리 등에 대해서 살펴보도록 하겠습니다..(if문에 대해 설명하기 전에 이것부터 말씀드렸어야 했는데 순서가 조금 바뀌었네요..;;)

 

2. 기본 문법

 

(1) 변수 선언 및 value 할당

 

Shell Script에서의 변수 선언 및 value 할당은 아주 간단합니다..

 

물론 Shell Script에서 사용하는 예약어(vi, ls, cd 등등)들은 변수로 사용하는 것을 가급적 피해야겠죠..

 

변수 선언 및 value 할당 방법은 다음과 같습니다..

변수명=value         (O)

 

변수명=  value         (X)

변수명  =value         (X)

변수명  =  value       (X)

 

ex.  idx=1

위 예시에서 보여드리는 것처럼 '변수명=value' 와 같은 식으로 변수 선언 및 할당을 해주면 되는데요..

 

주의하실 것은 '='(equal) 앞뒤로 공백이 없어야 한다는 것입니다..(제가 처음에 Shell Script를 짤 때 이 부분을 간과해서 엄청 고생했던 기억이..;;)

 

Java나 C같은 language에선 위와 같은 상황에서의 공백에 크게 구애받지 않죠..

 

MS PowerShell이나 VB Script 등에서도 그렇구요..

 

유독 UNIX나 LINUX에서 사용하는 Shell Script에서만 공백이 문제가 됩니다..

 

위와 같이 변수에 값을 할당한 후, 다른 라인에서 해당 변수를 사용하려면 '$'를 붙여서 버퍼에 저장된 변수값을 호출하여 사용하면 됩니다..

ex.  idx=1

      echo $idx

 

(2) 수치 계산

 

이렇게 변수를 선언하여 값을 할당하든, 외부로부터 매개변수를 받든, 변수에 할당된 산술값들을 계산해야 하는 경우가 생깁니다..

 

위와 같이 스크립트 내에서 산술값 계산을 위해 사용하는 것이 '(( ))'(이중 괄호) 입니다..

ex.  idx=$((idx * 10))

      sum=$((123 + 456))

      echo $idx $sum

      echo $((idx + 10))

위 예시에서처럼 산술식을 '(( ))'(이중 괄호)로 묶어주신 다음, 앞에 '$'를 붙여주면 계산된 결과값이 좌측의 변수에 할당이 되겠죠..

 

단, 한 가지 알아두셔야 할 것은 위와 같은 방식으로는 정수(.., -1, 0, 1, ..) 계산밖에는 할 수 없다는 것입니다..

 

소수점 계산 등의 더 복잡한 계산을 위해서는 계산기 shell command인 'bc' 를 사용하셔야 합니다..

 

이번 글에서는 그 부분까지 다루지는 않겠습니다..

 

이상으로 변수 선언과 수치 계산에 대해 살펴 보았고 다음 글에서는 배열 처리 부분에 대해서 말씀 드리도록 하겠습니다..

 

감사합니다..


반응형
반응형

안녕하세요, 박현명입니다..

 

이번 글에서는 지난 글들에서 말씀 드렸던 if문 사용법과 연산자들을 망라한 예제 스크립트를 보여 드리고 그에 대한 부연 설명을 통해 스크립트에 대한 이해를 돕는 시간을 갖도록 하겠습니다..

 

먼저 예제 스크립트 전문입니다..

#!/bin/sh
if [ -d $1 ]; then

        cd $1

        ##### Example 1. Test Operator
        if [ -f $2 ]; then
                echo $2' is file.'
                printf $2' is file.'\\n > $1/$2
        else
                echo $2' is not file.'
                touch $1/$2
                printf $2' file is created.'\\n > $1/$2
        fi

        ##### Example 2. Arithmetic Comparison Operator
        if [ $3 -gt 1 ]; then
                echo $3' is greater than 1.'
                printf $3' is greater than 1.'\\n >> $1/$2
        elif [ $3 -eq 1 ]; then
                echo $3' is equal to 1.'
                printf $3' is equal to 1.'\\n >> $1/$2
        else
                echo $3' is less than 1.'
                printf $3' is less than 1.'\\n >> $1/$2
        fi

        ##### Example 3. String Comparison Operator
        if [ $4 == "BMW" -o $5 == "Martiz" ]; then

                if [ $4 == "BMW" ]; then
                        echo $4' is very expensive car.'
                        printf $4' is very expensive car.'\\n >> $1/$2
                fi

                if [ $5 == "Martiz" ]; then
                        echo $5' is twins transformer.'
                        printf $5' is twins transformer.'\\n >> $1/$2
                fi

        else

                echo 'Both '$4' and '$5' are not mine.'
                printf 'Both '$4' and '$5' are not mine.'\\n >> $1/$2

        fi

fi

위와 같이 Shell Script를 작성하니 조금 복잡해 보이긴 하지만 50줄도 안되는 아주 간단한 예제입니다..

 

스크립트에 문단이라는 국어적 표현이 맞을지 모르나, 문단별로 나누어서 설명 드리도록 하겠습니다..

 

먼저 위 예제 스크립트는 외부로부터 변수를 받아 처리하기 위해 스크립트 내부적으로『 위치 매개변수($1, $2, $3, ..) 』를 사용하고 있습니다..

 

그리고 제일 첫 번째 라인은 해당 Shell Script 파일을 어떤 Shell로 처리할 것인지를 선언하는 부분입니다..

#!/bin/sh

다들 아시겠지만 Shell에는 bash, ksh, csh, tcsh 등 여러 종류가 있는데, 해당 OS에서 사용 가능한 Shell 이 어떤 것들이 있는지를 확인해 보고 싶다면 bin 디렉토리로 이동하여 다음과 같은 명령어를 수행시켜 보면 됩니다..

# ls *sh*

저의 예제는 ksh 또는 bash Shell 기준으로 만들어졌습니다..

 

이렇게 선언부를 간단히 처리하고 본격적인 Shell Script를 작성하시면 됩니다..

 

1) 첫 번째 문단

if [ -d $1 ]; then                                                   // 첫 번째 매개변수값이 디렉토리라면,

        cd $1                                                           // 해당 디렉토리로 이동

        ##### Example 1. Test Operator              // 주석
        if [ -f $2 ]; then                                           // 두 번째 매개변수값이 파일이라면,
                echo $2' is file.'                                   // '$2 is file.' 이라는 문장을 echo 한다.
                printf $2' is file.'\\n > $1/$2                // '$2 is file.' 이라는 문장을 $1 디렉토리 밑에 $2 파일에 printf 하고 줄바꿈(\n: 개행문자)한다.
        else                                                            // 두 번째 매개변수값이 파일이 아니라면,
                echo $2' is not file.'                            // '$2 is not file.' 이라는 문장을 echo 한다.
                touch $1/$2                                       // $1 디렉토리 밑에 $2 파일을 만든다.
                printf $2' file is created.'\\n > $1/$2  // '$2 file is created.' 라는 문장을 $2 파일에 printf 하고 줄바꿈(\\n) 한다.

        fi

라인별 설명은 위 내용을 참조하시면 되겠고,

 

결국 위 구문을 말로 풀어내자면,

 

첫 번째 매개변수값에 해당하는 디렉토리($1)가 존재하면 change directory하고 output으로 생성할 파일($2)이 있는지 확인한 후(없으면 만들고), 조건식의 true 여부에 따라 각각에 해당하는 문장을 echo 및 printf 하겠다는 것입니다..

 

별로 어렵지 않죠?

 

위 구문 중 touch 명령 라인은 굳이 사용하지 않아도 바로 밑 라인의 '>(redirection)' command 에 의해 자동 파일 생성하게 됩니다..

 

echo나 printf 구문 뒤에는 위와 같이 문자열 등이 올 수 있는데, 문자열은 반드시 '(single quotation) 나 "(double quotation)로 wrap 해 주셔야 하며, 위치 매개변수의 경우엔 quotation 바깥에 명시해 주어야만 실제 매개변수값을 전달받을 수 있습니다..(echo $2' is file.')

 

2) 두 번째 문단

        ##### Example 2. Arithmetic Comparison Operator
        if [ $3 -gt 1 ]; then
                echo $3' is greater than 1.'
                printf $3' is greater than 1.'\\n >> $1/$2
        elif [ $3 -eq 1 ]; then
                echo $3' is equal to 1.'
                printf $3' is equal to 1.'\\n >> $1/$2
        else
                echo $3' is less than 1.'
                printf $3' is less than 1.'\\n >> $1/$2
        fi

두 번째 문단에서 주의 깊게 살펴 보셔야할 부분은 elif 구문 뒤에 조건식이 들어간다는 것입니다..(지난 글에서는 언급이 없었네요..;;)

 

elif 구문이 else if 구문과 같으므로 당연히 조건식이 들어가야만 하겠죠..(조건식이 없어도 되는 것은 else 뿐입니다..)

 

3) 세 번째 문단

        ##### Example 3. String Comparison Operator
        if [ $4 == "BMW" -o $5 == "Martiz" ]; then

                if [ $4 == "BMW" ]; then
                        echo $4' is very expensive car.'
                        printf $4' is very expensive car.'\\n >> $1/$2
                fi

                if [ $5 == "Martiz" ]; then
                        echo $5' is twins transformer.'
                        printf $5' is twins transformer.'\\n >> $1/$2
                fi

        else

                echo 'Both '$4' and '$5' are not mine.'
                printf 'Both '$4' and '$5' are not mine.'\\n >> $1/$2

        fi

세 번째 문단은 문자열 비교 예시로써, 앞서 제가 올린 글들을 잘 읽어 보셨다면 역시 별 무리 없이 이해하실 수 있을 것입니다..

 

위 문단에서 한 가지 언급 드리고 싶은 것은 문자열 비교 시에 대소문자를 구분한다는 것입니다..(이 역시 지난 글에서는 빠져있었네요..;;;;)

 

만일 네 번째 위치 매개변수의 값으로 'bmw' 라는 소문자 문자열이 입력되었다면, 위 문단의 두 번째 조건식($4 == "BMW")에서 false 를 리턴하겠죠..

 

이제 이렇게 작성된 스크립트를 실행시키려면, 사용자가 로그인한 바로 그 계정에서 해당 스크립트에 대한 실행 권한이 있어야 합니다..

 

즉, vi 편집기로 위와 같이 작성 완료한 후에 스크립트 실행 전, 다음과 같이 모드를 변경해 주어야 합니다..

# chmod 755 IfTest.sh

# ls -l IfTest.sh

-rwxr-xr-x       1 root        root           1185  Aug    9  16:52   IfTest.sh

권한이나 모드 변경에 대한 것은 이 글을 읽고 있는 분들께서 사전에 알고 계실 것이라 믿고 설명을 생략하도록 하겠습니다..

 

위와 같이 하였다면 이제 다음과 같이 인자를 주고 실행시킨 후, 결과가 잘 나오는지를 확인하면 됩니다..

./IfTest.sh /opt IfTestResult.txt 0 bmw Martiz

 

이상으로 if문을 포함하는 Shell Script에 대하여 예시를 통해 한 번 알아보았습니다..

 

다음 시간에는 Shell Script의 기본 문법 몇 가지에 대해서 말씀 드리도록 하겠습니다..

 

감사합니다..


반응형
반응형

안녕하세요, 박현명입니다..

 

if문 세 번째 글 올립니다..

 

이번 글에서는 if문 사용 시 조건식에서 두 개 이상의 조건을 사용하려 할 때의 연산자 사용법에 대해서 말씀 드리도록 하겠습니다..

 

--------------------------------------------------------------------------------(지난 글)--------------------------------------------------------------------------------

(2) 테스트 연산자

 

[ ](대괄호) 안의 조건식에는 여러 종류의 테스트 연산자를 사용할 수 있으며, 연산자의 종류 및 기능은 다음과 같습니다..

* 다음 조건을 충족시킬 경우, true 리턴

-e : 존재하는 파일
-f : 보통 파일
-d : 파일이 디렉토리
-s : 파일 크기가 0이 아님
-z : 문자열이 null임. 길이가 0
-n : 문자열이 null이 아님
-c : 파일이 문자 디바이스(키보드, 모뎀, 사운드 카드..)
-b : 파일이 블럭 디바이스(플로피나 CD롬)
-p : 파일이 파이프
-h : 파일이 하드 링크
-L : 파일이 심볼릭 링크
-S : 파일이 소켓
-t : 파일 디스크립터가 터미널 디바이스와 연관 있음
-r : 테스트를 돌리는 사용자가 읽기 퍼미션을 갖고 있음
-w : 테스트를 돌리는 사용자가 쓰기 퍼미션을 갖고 있음
-x : 테스트를 돌리는 사용자가 실행 퍼미션을 갖고 있음
-g : 파일이나 디렉토리에 set-group-id 플래그가 세팅되어 있음

가령 예를 들자면,

if [ -d /tmp ]; then

    echo '/tmp 디렉토리가 존재합니다.'

else

    echo '/tmp 디렉토리가 존재하지 않습니다.'

fi

위와 같이 사용하면 됩니다..

 

파일과 관련한 연산자일 경우는 연산자 뒤에 파일명이, 디렉토리와 관련한 연산자일 경우는 연산자 뒤에 디렉토리명이 명시되어야 합니다..

 

다음은 산술 비교 연산자 및 문자열 비교 연산자입니다..

 

산술 비교 연산자

문자열 비교 연산자

-eq (equal)

== 

-ne (not equal)

!=

-gt (greater than)

 

-ge (greater than or equal)

 

-lt (less than)

 

-le (less than or equal)

 

 

산술 비교 연산자는 수치 비교를 위해 사용되며, 다음과 같이 사용됩니다..

if [ ${input} -eq 0 ]; then

    echo 'input 값은 0과 같습니다.'

else

    echo 'input 값은 0과 같지 않습니다.'

fi

문자열 비교 연산자는 수치 비교를 위해 사용되며, 다음과 같이 사용됩니다..

if [ ${input} == "test" ]; then

    echo 'input 값은 test 문자열과 같습니다.'

else

    echo 'input 값은 test 문자열과 같지 않습니다.'

fi

'$(달러)' 문자로 시작되는 값은 변수를 의미합니다..

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

(3) 논리 연산자

 

[ ](대괄호) 안의 조건식에 두 개 이상의 조건을 넣어야 할 경우 논리 연산자를 사용할 수 있으며, 연산자의 종류 및 기능은 다음과 같습니다..

-a : and, &&

-o : or, ||

논리 연산자의 사용법은 다음과 같습니다..

if [ 조건식1 -a 조건식2 ]; then

    ~

else

    ~

fi

다들 알고 계시겠지만, and 논리 연산자의 경우 '조건식1' 이 true 이어야지만 '조건식2' 로 넘어가며, '조건식1' 이 false인 경우 '조건식2' 의 체크없이 바로 else 구문으로 넘어가게 됩니다..

 

사용 예를 들자면, 다음과 같습니다..

if [ -f ${file1} -a -f ${file2} ]; then

    echo 'file1과 file2는 모두 파일입니다.'

else

    echo 'file1과 file2가 모두 파일인 것은 아닙니다.'

fi

이상은 논리 연산자에 대한 사용법에 대해서 설명 드렸고, 다음은 자주 사용되는 연산자는 아니지만 추가로 덧붙입니다..

 

(4) 파일 생성 시기 비교 연산자

 

[ ](대괄호) 안의 조건식에 두 개의 파일 중 어떤 것이 더 먼저, 혹은 나중에 생성되었는지 알고자 할 경우 다음과 같은 비교 연산자를 사용할 수 있습니다..

f1 -nt f2 : f1파일이 f2파일보다 최신임(newer than)
f1 -ot f2 : f1파일이 f2파일보다 예전것임(older than)

위 연산자에 대한 예시는 따로 들지 않겠습니다..

 

이상으로 if문에서 자주 사용되는 연산자들과 사용법에 대해서 알아보았구요..

 

예제 스크립트로 바로 넘어갈까 했는데 한 가지 더 설명드리고 예제 스크립트를 보여 드리는 편이 나을 것 같아서 잠깐 언급하도록 하겠습니다..

 

* Shell Script 에서 input 값 받아 처리하기

 

우리가 Shell Script를 작성하다 보면 외부로부터 받은 input 값을 스크립트 내부에서 처리해야 하는 경우가 종종 발생하게 됩니다..

 

가령, ./test.sh [input_parameter1] [input_parameter2] 와 같은 식으로 말이죠..

 

위와 같이 외부로부터 받은 input 값은『 위치 매개변수 』를 통하여 처리하면 됩니다..

$1, $2, $3, ... : input_parameter1은 $1 위치 매개변수로, input_parameter2는 $2 위치 매개변수로 처리

※ $0 : 해당 Shell Script의 이름

예를 들어, 스크립트로 넘어온 input 값이 0인지 아닌지 비교하는 스크립트(ex. number_compare.sh)를 작성하고 싶다 하면 다음과 같이 하면 됩니다..

#!/bin/sh

if [ $1 -eq 0 ]; then

    echo 'input 값은 0 입니다.'

else

    echo 'input 값은 0 이 아닙니다.'

fi

위와 같이 작성하고 다음과 같이 실행시키면 됩니다..

 ./number_compare.sh [숫자]

다음 글에서는 input 값을 받아서 if문을 통해 처리하는 조금 복잡한 예제 스크립트에 대해서 알아보도록 하겠습니다..

 

감사합니다..


반응형
반응형

안녕하세요, 박현명입니다..

 

이번 글은 지난 글에 이어 Shell Script 작성 시 if문 사용법에 대한 두 번째 글입니다..

 

지난 글에서 공지해 드린 대로 이번 글에서는 if문 조건식에서 사용되는 각종 연산자 및 옵션 등에 대해서 설명 드리도록 하겠습니다..

 

--------------------------------------------------------------------------------(지난 글)--------------------------------------------------------------------------------

1. if문

 

(1) 기본 사용법

if [ 조건식 ]; then          // if문 시작

    ~

elif

    ~

else

    ~

fi                                  // if문 종료

if문은 IT업계에 종사하는 분이라면 굳이 개발자가 아니더라도 누구나 다 알고 계실 겁니다..

 

elif 는 else if 구문이라는 것도 다 아실 것이구요..

 

위 구문에서 한 가지 주의할 점은 if문 선언 시의 띄어쓰기와 세미콜론(;) 입니다..

 

if 와 [ ](대괄호) 사이는 반드시 한 칸 띄워주어야 합니다..(제가 Shell Script를 처음 작성할 때 이 띄어쓰기를 간과했다가 한참을 헤맸던 기억이..;;)

 

그리고 위와 같이 if 와 then 을 한 line에 나열하려면 반드시 세미콜론(;)을 사용해야 합니다..

 

세미콜론을 사용하지 않으려면 다음과 같이 if 다음 열에 then 을 사용해야 합니다..

if [ 조건식 ]

then                    // if문 시작

    ~

elif

    ~

else

    ~

fi                         // if문 종료

 또한, 조건식을 넣는 부분에 [ ](대괄호) 대신 test 구문을 사용할 수도 있습니다..

if test 조건식

then                    // if문 시작

    ~

elif

    ~

else

    ~

fi                         // if문 종료

test 구문과 [ ](대괄호)는 동일한 기능을 하며, 취향에 따라 골라 쓰면 됩니다..

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

(2) 테스트 연산자

 

[ ](대괄호) 안의 조건식에는 여러 종류의 테스트 연산자를 사용할 수 있으며, 연산자의 종류 및 기능은 다음과 같습니다..

* 다음 조건을 충족시킬 경우, true 리턴

-e : 존재하는 파일
-f : 보통 파일
-d : 파일이 디렉토리
-s : 파일 크기가 0이 아님
-z : 문자열이 null임. 길이가 0
-n : 문자열이 null이 아님
-c : 파일이 문자 디바이스(키보드, 모뎀, 사운드 카드..)
-b : 파일이 블럭 디바이스(플로피나 CD롬)
-p : 파일이 파이프
-h : 파일이 하드 링크
-L : 파일이 심볼릭 링크
-S : 파일이 소켓
-t : 파일 디스크립터가 터미널 디바이스와 연관 있음
-r : 테스트를 돌리는 사용자가 읽기 퍼미션을 갖고 있음
-w : 테스트를 돌리는 사용자가 쓰기 퍼미션을 갖고 있음
-x : 테스트를 돌리는 사용자가 실행 퍼미션을 갖고 있음
-g : 파일이나 디렉토리에 set-group-id 플래그가 세팅되어 있음

가령 예를 들자면,

if [ -d /tmp ]; then

    echo '/tmp 디렉토리가 존재합니다.'

else

    echo '/tmp 디렉토리가 존재하지 않습니다.'

fi

위와 같이 사용하면 됩니다..

 

파일과 관련한 연산자일 경우는 연산자 뒤에 파일명이, 디렉토리와 관련한 연산자일 경우는 연산자 뒤에 디렉토리명이 명시되어야 합니다..

 

다음은 산술 비교 연산자 및 문자열 비교 연산자입니다..

 

산술 비교 연산자

문자열 비교 연산자

-eq (equal)

== 

-ne (not equal)

!=

-gt (greater than)

 

-ge (greater than or equal)

 

-lt (less than)

 

-le (less than or equal)

 

 

산술 비교 연산자는 수치 비교를 위해 사용되며, 다음과 같이 사용됩니다..

if [ ${input} -eq 0 ]; then

    echo 'input 값은 0과 같습니다.'

else

    echo 'input 값은 0과 같지 않습니다.'

fi

문자열 비교 연산자는 수치 비교를 위해 사용되며, 다음과 같이 사용됩니다..

if [ ${input} == "test" ]; then

    echo 'input 값은 test 문자열과 같습니다.'

else

    echo 'input 값은 test 문자열과 같지 않습니다.'

fi

'$(달러)' 문자로 시작되는 값은 변수를 의미합니다..

 

두 번째 글은 여기서 마치도록 하겠습니다..

 

다음 글에서는 조건식의 조건이 두 개 이상일 경우 사용되는 연산자와 if문 예제 스크립트에 대해서 게재하도록 하겠습니다..

 

감사합니다..


반응형
반응형

안녕하세요, 박현명입니다..

 

금일부터 유용한 Shell Script에 대한 글을 올리도록 하겠습니다..(bash/ksh 기준)

 

자주 사용하게 되는 Shell command 들이나 연산자, 조건문/반복문, 배열 처리 등을 다룰 예정이며, 최대한 알기 쉽게 설명 드리겠습니다..

 

UNIX나 LINUX 환경에서 자주 작업하게 되는 엔지니어분들께 도움이 되길 바랍니다..

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1. if문

 

(1) 기본 사용법

if [ 조건식 ]; then          // if문 시작

    ~

elif

    ~

else

    ~

fi                                  // if문 종료

if문은 IT업계에 종사하는 분이라면 굳이 개발자가 아니더라도 누구나 다 알고 계실 겁니다..

 

elif 는 else if 구문이라는 것도 다 아실 것이구요..

 

위 구문에서 한 가지 주의할 점은 if문 선언 시의 띄어쓰기와 세미콜론(;) 입니다..

 

if 와 [ ](대괄호) 사이는 반드시 한 칸 띄워주어야 합니다..(제가 Shell Script를 처음 작성할 때 이 띄어쓰기를 간과했다가 한참을 헤맸던 기억이..;;)

 

그리고 위와 같이 if 와 then 을 한 line에 나열하려면 반드시 세미콜론(;)을 사용해야 합니다..

 

세미콜론을 사용하지 않으려면 다음과 같이 if 다음 열에 then 을 사용해야 합니다..

if [ 조건식 ]

then                    // if문 시작

    ~

elif

    ~

else

    ~

fi                         // if문 종료

 또한, 조건식을 넣는 부분에 [ ](대괄호) 대신 test 구문을 사용할 수도 있습니다..

if test 조건식

then                    // if문 시작

    ~

elif

    ~

else

    ~

fi                         // if문 종료

test 구문과 [ ](대괄호)는 동일한 기능을 하며, 취향에 따라 골라 쓰면 됩니다..

 

이번 글은 이 정도에서 마무리하도록 하고 if문 두 번째 글은 조건식에서 사용되는 각종 연산자에 대해서 알아보도록 하겠습니다..

 

감사합니다..


반응형
반응형

centos 6.4 에서 ulimit 으로 인한 max connection 에러가 발생해서

확인한 부분 공유 드립니다.

( 대부분 아시는 내용일텐데 cent 6.4 에서 max user process default 설정이 조금 변경되어서 헤메었던 상황이라 공유 드립니다. ㅎ)

 

일단 제가 잘못 알고 있었던 부분은 mysql  multi thread 기반이라 max connection 에 영향을 주는 os limit  nofile 만 인 걸로 생각했었는데

noproc 도 영향을 받네요…  

 

 

그리고 cent6.4 에서 root를 제외한 계정의 noproc soft limit default  1024 이고

/etc/security/limits.d/90-nproc.conf  라는 파일에 아래와 같이 default 로 설정 되어 있습니다. 

 

그래서 cent 5.x 에서 하듯이 /etc/security/limits.conf 에 설정을 해도 nproc soft limit 은 계속 1024 로

변경이 되지 않았습니다.

( 운영시 설정 변경할 때 limits.d 아래에 파일을 만들어서 6.4 방식으로 하던지 아니면 없애고

/etc/security/limits.conf 파일에 설정하던지 해야 할 거 같습니다. )

 

아래 보면 root는 unlimited 이지만 그외 계정들은 1024 이기 때문에 mysqld 까지 root 로 띄우지 않으면

1024 의 제한을 받게 됩니다.

[root@testvm2 limits.d]# pwd

/etc/security/limits.d

[root@testvm2 limits.d]# ls -lrt

total 4

-rw-r--r--. 1 root root 191 Feb 22  2013 90-nproc.conf

[root@testvm2 limits.d]# cat 90-nproc.conf

# Default limit for number of user's processes to prevent

# accidental fork bombs.

# See rhbz #432903 for reasoning.

*          soft    nproc     1024

root       soft    nproc     unlimited

 

 

##### limit 변경 전

 

1)     Mysqld  pid 확인

 

[svcop@y-db01 ~]$ ps -ef | grep mysql

root      5392     1  0  2013 ?        00:00:00 /bin/sh /usr1/mariadb/5.5.34/bin/mysqld_safe --datadir=/usr1/mariadb/DBSpace_y-db01/DATA --pid-file=/tmp/mysqld.pid

mysql     6549  5392  0  2013 ?        00:55:27 /usr1/mariadb/5.5.34/bin/mysqld --basedir=/usr1/mariadb/5.5.34 --datadir=/usr1/mariadb/DBSpace_y-db01/DATA --plugin-dir=/usr1/mariadb/5.5.34/lib/plugin --user=mysql --log-error=/usr1/mariadb/5.5.34/admin/log/error.log --open-files-limit=40960 --pid-file=/tmp/mysqld.pid --socket=/tmp/mysql.sock --port=19336

svcop    17215 17149  0 09:59 pts/1    00:00:00 grep mysql

 

2)     해당 process  limit 확인

 

[root@y-db01 ~]# cat /proc/6549/limits

Limit                     Soft Limit           Hard Limit           Units

Max cpu time              unlimited            unlimited            seconds

Max file size             unlimited            unlimited            bytes

Max data size             unlimited            unlimited            bytes

Max stack size            10485760             unlimited            bytes

Max core file size        0                    0                    bytes

Max resident set          unlimited            unlimited            bytes

Max processes             1024                 unlimited            processes     <---------- soft limit 1024로 되어 있음 

Max open files            50005                50005                files

Max locked memory         65536                65536                bytes

Max address space         unlimited            unlimited            bytes

Max file locks            unlimited            unlimited            locks

Max pending signals       255493               255493               signals

Max msgqueue size         819200               819200               bytes

Max nice priority         0                    0

Max realtime priority     0                    0

Max realtime timeout      unlimited            unlimited            us

 

 

3)   Mysql connection 테스트

-    1024 개 이상으로 connection 시도

-    Error 발생

[root@y-db01 ~]# mysql -u root -p

Enter password:

ERROR 1135 (HY000): Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug

 

4)    Connection 에러 발생시에 Mysql process 개수 확인

 

[root@y-db01 ~]# pstree

init─┬─agetty

     ├─auditd───{auditd}

     ├─crond

     ├─dbus-daemon

     ├─2*[dhclient]

     ├─6*[mingetty]

     ├─mysqld_safe───mysqld───1023*[{mysqld}]

     ├─nmon

     ├─ntpd

     ├─rsyslogd───3*[{rsyslogd}]

     ├─snmpd

     ├─sshd─┬─sshd───sshd───bash───sudo───su───bash───tail

           └─sshd───sshd───bash───sudo───su───bash───pstree

     ├─udevd───2*[udevd]

     └─xe-daemon───sleep

 

### Noproc Limit 변경

 

-    /etc/security/limits.d/90-nproc.conf 파일 삭제

-    /etc/security/limits.conf 에 설정

*               soft            nproc           unlimited

*               hard            nproc           unlimited

*               soft            nofile          65536

*               hard            nofile          65536

*               soft            fsize           unlimited

*               hard            fsize           unlimited

*               soft            stack           unlimited

*               hard            stack           unlimited

 

 

5)   Mysqld 재시작

 

service mysqld stop

service mysqld start

 

6)   Limit 정상 적용 여부 확인

 

[root@y-db01 log]# ps -ef | grep mysql

root      2999     1  0 11:08 pts/0    00:00:00 /bin/sh /usr1/mariadb/5.5.34/bin/mysqld_safe --datadir=/usr1/mariadb/DBSpace_y-db01/DATA --pid-file=/tmp/mysqld.pid

mysql     4144  2999  3 11:08 pts/0    00:00:04 /usr1/mariadb/5.5.34/bin/mysqld --basedir=/usr1/mariadb/5.5.34 --datadir=/usr1/mariadb/DBSpace_y-db01/DATA --plugin-dir=/usr1/mariadb/5.5.34/lib/plugin --user=mysql --log-error=/usr1/mariadb/5.5.34/admin/log/error.log --open-files-limit=40960 --pid-file=/tmp/mysqld.pid --socket=/tmp/mysql.sock --port=19336

root      4265 32576  0 11:10 pts/0    00:00:00 grep mysql

 

[root@y-db01 log]# cat /proc/4144/limits

Limit                     Soft Limit           Hard Limit           Units

Max cpu time              unlimited            unlimited            seconds

Max file size             unlimited            unlimited            bytes

Max data size             unlimited            unlimited            bytes

Max stack size            unlimited            unlimited            bytes

Max core file size        0                    0                    bytes

Max resident set          unlimited            unlimited            bytes

Max processes             unlimited            unlimited            processes   ß----- 변경 되었음 …

Max open files            50005                50005                files

Max locked memory         65536                65536                bytes

Max address space         unlimited            unlimited            bytes

Max file locks            unlimited            unlimited            locks

Max pending signals       255493               255493               signals

Max msgqueue size         819200               819200               bytes

Max nice priority         0                    0

Max realtime priority     0                    0

Max realtime timeout      unlimited            unlimited            us

 

 

7)   Mysql connection test 이상 없음

 

 

이 작성자의 게시글|더보기
웹티즌개발팀
덧글 2개||조회수 75|2
  • 2014/01/16 10:47

    예전에 Cent6에서 이 문제로 커넥션이 1000개 이상 못갔었던 기억이 나네요. ^^ㅋ
    진짜로 MySQL 데몬한테 적용이 되었는지는 아래로 한 방에 확인할 수 있어요. ㅎ
    ps -u mysql | grep mysql | awk '{print $1}' | xargs -i cat /proc/{}/limits

  • 2014/02/13 22:55

    sudo su -

    cat /proc/`ps -ef | grep mysql | grep port | awk -F' ' '{print $2}'`/limits

    cat /etc/security/limits.d/90-nproc.conf

    vi /etc/security/limits.d/90-nproc.conf
    ================================================================================
    ...
    * - nofile 65536
    * - nproc unlimited
    ================================================================================

    cat /etc/security/limits.d/90-nproc.conf


    sudo su - mysql

    service mysqld restart

    cat /proc/`ps -ef | grep mysql | grep port | awk -F' ' '{print $2}'`/limits

    pstree


반응형
반응형
공개커넥션 풀 프로그램 설명
http://tunelinux.pe.kr
http://database.sarang.net
2004.12.24
문태준

커넥션 풀은 프로그램(java, c, php 등등)과 db사이에서 db연결을 pool로 만들어 제어해주는 것입니다.
PHP에서 사용할 수 있는 공개 커넥션 풀 프로그램을 찾은 것이 있어서 여기 올립니다.
여기서는 간단한 사용법만 설명합니다. 자세한건 설명서와 옵션을 열심히 보고 고민해야 할듯.

구조는 다음과 같습니다.
db접속요청 -> 커넥션 풀 대몬 -> db 접속
db접속요청이 늘어나도 db 프로세스 갯수는 일정합니다. 커넥션 풀을 이용하여 자원관리를 하는 것입니다.

SQL Relay
http://sqlrelay.sourceforge.net/

SQL Relay is a persistent database connection pooling, proxying and load balancing system for Unix and Linux.

지원 DB는 다음과 같습니다.
* Oracle
* MySQL
* mSQL
* PostgreSQL

       

* Sybase
* MS SQL Server
* IBM DB2
* Interbase

       

* Sybase
* SQLite
* Lago
* ODBC

지원 api
* C
* C++
* Perl

       

* Python
* PHP
* Ruby

       

* Java
* TCL
* Zope


설치방법
http://sqlrelay.sourceforge.net/download.html 에서 SRPM을 이용하여 새로 RPM을 만들었습니다.
설치설명서를 참고하면 여러가지 방법을 이용할 수 있습니다. http://sqlrelay.sourceforge.net/sqlrelay/installing.html

SRPM을 설치하고 RPM을 만들때 여러가지 RPM파일을 요구합니다. 나오는 내용을 보고 설치해주면 됩니다.
gtk-devel 등등.

PHP를 사용하는데 소스로 설치했더니 php-config (php 확장모듈 만들때 쓰지요?) 를 못 찾더군요. 아마도 경로를 지정해주면 될듯한데 그냥 귀찮아서 php rpm을 설치하였습니다. 임시테스팅이 목적이었으므로.

설치시 불필요한 db, api를 명시해주지 않으면 rpm을 만들다가 에러가 납니다.

rpm -ta -without oracle -without zope sqlrelay-xxx.tar.gz

위와 같은 식입니다.

rpmbuild -without db2 -without freetds --without oracle -without zope sqlrelay.spec

나온 파일을 필요에 따라 설치합니다.

[root@kdu i386]# ls -1 
sqlrelay-0.35-1.i386.rpm
sqlrelay-client-devel-c-0.35-1.i386.rpm
sqlrelay-client-devel-c++-0.35-1.i386.rpm
sqlrelay-client-mysql-0.35-1.i386.rpm
sqlrelay-client-postgresql-0.35-1.i386.rpm
sqlrelay-client-runtime-c-0.35-1.i386.rpm
sqlrelay-client-runtime-c++-0.35-1.i386.rpm
sqlrelay-clients-0.35-1.i386.rpm
sqlrelay-config-gtk-0.35-1.i386.rpm
sqlrelay-doc-0.35-1.i386.rpm
sqlrelay-man-0.35-1.i386.rpm
sqlrelay-mysql-0.35-1.i386.rpm
sqlrelay-perl-0.35-1.i386.rpm
sqlrelay-php-0.35-1.i386.rpm

# rpm -ivh *.rpm

# rpm -ql sqlrelay | grep bin
/usr/bin/sqlr-cachemanager
/usr/bin/sqlr-listener
/usr/bin/sqlr-listener-debug
/usr/bin/sqlr-scaler
/usr/bin/sqlr-start
/usr/bin/sqlr-stop


# rpm -ql sqlrelay-php
/usr/lib/php4/sql_relay.so -> 이게 php모듈이지요.
/usr/share/pear/DB/sqlrelay.php


sqlrelay rpm으로 설치를 하면 /etc/sqlrelay.conf 파일을 만들어 설정합니다.
샘플은 /etc/sqlrelay.conf.example 입니다.


# ls /etc/sqlrelay.*
/etc/sqlrelay.conf /etc/sqlrelay.conf.example /etc/sqlrelay.dtd 

아래와 같이 임시로 세팅했습니다.

mysql 의 경우 최소 수정할것 
id : instance id. sqlr-start 할때 필요함
dbase : mysql
connections : 초기 연결할 갯수
maxconnections : 최대 접속자

users 는 해당 api에서 접속할때 필요한 사용자, 비밀번호입니다. 나중 php소스코드보면 이해감.

connections는 커넥션 풀을 만들때 사용하는 db, user 등의 정보임.


<?xml version="1.0"?>
<!DOCTYPE instances SYSTEM "sqlrelay.dtd">

<instances>

<instance id="example" port="9000" socket="/tmp/example.socket" dbase="mysql" connections="20" maxconnections="500" maxqueuelength="5" growby="1" ttl="60" endofsession="commit" sessiontimeout="600" runasuser="nobody" runasgroup="nobody" cursors="5" authtier="listener" handoff="pass" deniedips="" allowedips="" debug="none">
<users>
<user user="user1" password="password1"/>
<user user="user2" password="password2"/>
<user user="user3" password="password3"/>
</users>
<connections>
<connection connectionid="db1" string="user=aaaat;password=aaaa;db=test;host=localhost;port=3306;socket=/var/lib/mysql/mysql.sock;" metric="1"/>
<connection connectionid="db2" string="user=aaaa;password=aaaa;db=test;host=localhost;port=3306;socket=/var/lib/mysql/mysql.sock;" metric="1"/>
<connection connectionid="db3" string="user=aaaa;password=aaaa;db=test;host=localhost;port=3306;socket=/var/lib/mysql/mysql.sock;" metric="1"/>

</connections>
</instance>

</instances>

이제 커넥션풀을 시작합니다.
# sqlr-start -id example -config /etc/sqlrelay.conf 

# ps auxw | grep sqlr
nobody 20725 0.0 0.2 3600 1408 ? S 16:11 0:00 sqlr-listener -id example -config /etc/sqlrelay.conf
nobody 20728 0.0 0.3 4288 1720 ? S 16:11 0:00 sqlr-connection-mysql -id example -connectionid db1 -config /etc/sqlr
nobody 20731 0.0 0.3 4292 1720 ? S 16:11 0:00 sqlr-connection-mysql -id example -connectionid db1 -config /etc/sqlr
nobody 20734 0.0 0.3 4292 1720 ? S 16:11 0:00 sqlr-connection-mysql -id example -connectionid db1 -config /etc/sqlr
nobody 20785 0.0 0.3 4288 1720 ? S 16:11 0:00 sqlr-connection-mysql -id example -connectionid db5 -config /etc/sqlr
nobody 20787 0.0 0.2 3572 1368 ? S 16:11 0:00 sqlr-scaler -id example -config /etc/sqlrelay.conf
root 20793 0.0 0.2 3488 1072 ? S 16:11 0:00 sqlr-cachemanager

위에서 보듯이 몇가지 프로세서로 이루어집니다.


끝내기
# sqlr-stop 
id를 지정하지 않으면 몽땅 죽입니다.

mysqladmin pro 에서 보면 connections 만큼 mysql 과 연결되어있습니다.

샘플코드 php

# cat sql.php 
<?
dl("sql_relay.so");

$con=sqlrcon_alloc("localhost",9000,"","user1","password1",0,1) or die ("connect error");
$cur=sqlrcur_alloc($con);

echo "sendquery";
sqlrcur_sendQuery($cur,"select * from test");

#sqlrcur_sendFileQuery($cur,"/usr/local/myprogram/sql","myquery.sql");
echo "endsession";
sqlrcon_endSession($con);

sqlrcur_sendQuery($cur,"select * from test");
sqlrcon_endSession($con);

sqlrcur_free($cur);
sqlrcon_free($con);
?>

사이트에 나온 소스코드에서는 아래와 같이 나와있는데 " 를 넣어주지 않으면 에러가 납니다. ; 도 빠져있구요.
dl(sql_relay.so)




** SQLB 
http://sqlb.sourceforge.net/frameset.html
The SQLB project is used to improve SQL requests to a database. It supports MySQL, PostgreSQL and Oracle(tm).

It is a set of deamon programs that make multiple permanent connection to one or more database when they start. Then an external program, previously linked with the sqlb client library, can send SQL requests to these deamons and get the result without any need to make a connection/disconnection. The SQLB PHP and Perl modules provided here with SQLB are some examples of such programs.

** 기타 참고자료
http://www.phpschool.com/bbs2/inc_view.html?id=6888&code=tnt2 : Too many connections 에러와 DB pool 사용
http://www.phpschool.com/bbs2/inc_view.html?id=8132&code=tnt2 : 새로운 요청 처리 방법
http://www.phpschool.com/bbs2/inc_view.html?id=10093&code=tnt2 : 데이터베이스 풀링에 대한 sqlrelay 설치 문서
http://www.openphp.com/board/board_center.html?Type=View&tb_name=board_php_study&id=50&start=0&id_no=16 : [DB] DBConnection Pool 에 대해 간략한 설명 (여기 사이트에 sqlb와 sqlrelay 에 대한 소개자료는 있지만 상세한 사용법은 없음)

<noscript></noscript>

 04-12-24 17:22 |삭제
 php에서는 pool을 쓰기 쉽게 안해놨을까요?? 
대용량 시스템에서는 필요한 거 아닌가요???
<textarea style="DISPLAY: none" id="save_comment_36318">왜 php에서는 pool을 쓰기 쉽게 안해놨을까요??대용량 시스템에서는 필요한 거 아닌가요???</textarea>
<textarea style="DISPLAY: none" id="save_comment_36319">전역으로 사용하신다면 php.ini 에 로드시키는게 낳습니다.http://www.phpschool.com/bbs2/inc_view.html?id=10093&code=tnt2&start=0&mode=search&field=title&search_name=&operator=and&period=all&category_id=&s_que=sqlrelay</textarea>
전영규 04-12-24 19:48 |삭제
컨넥션풀의 의도는 좋지만 효용성이... ; 
1. 트랜잭션 등이 컨넥션 단위로 이뤄지므로, 이전 컨넥션을 디스컨넥 하지 않고 승계했을 때 발생하는 트랜잭션 관련 문제.. 
2. 컨넥션풀을 쓴다 해도, 최대 컨넥션을 다 채웠을 경우는 도움이 되지 않는다. 
3. 컨넥션풀의 미들웨어(!)를 쓸 때 발생하는 속도저하문제... 

4. 컨넥션풀은 컨넥션을 하는 작업 자체가 과도한 부하(시간 및 cpu 자원등)를 유발할 때 해결책이 될 수 있는데, 
mysql 및 기타 대형DB 들도 컨넥션에 드는 부하는 그리 크지 않다... ;; 

-- jeon.
<textarea style="DISPLAY: none" id="save_comment_36320">컨넥션풀의 의도는 좋지만 효용성이... ;1. 트랜잭션 등이 컨넥션 단위로 이뤄지므로, 이전 컨넥션을 디스컨넥 하지 않고 승계했을 때 발생하는 트랜잭션 관련 문제..2. 컨넥션풀을 쓴다 해도, 최대 컨넥션을 다 채웠을 경우는 도움이 되지 않는다.3. 컨넥션풀의 미들웨어(!)를 쓸 때 발생하는 속도저하문제...4. 컨넥션풀은 컨넥션을 하는 작업 자체가 과도한 부하(시간 및 cpu 자원등)를 유발할 때 해결책이 될 수 있는데,mysql 및 기타 대형DB 들도 컨넥션에 드는 부하는 그리 크지 않다... ;;-- jeon.</textarea>
오해를 04-12-24 20:11 |삭제
/jeon 

1. 트랜잭션은 커넥션 단위라기 보다는 디스커넥트 발생시 자동으로 comit 또는 rollback 등이 발생되는 개념이며, 명시적으로 또는 pool에서 이에 대한 commit / rollback을 지원한다. 

2. 커넥션 풀의 용도는 가용성이 아니라, 커넥션 생성에 드는 비용을 줄이기 위함이다. 

3. 속도저하 문제는 막연한 추측만으로 이룰 수 없다. 실제 프로파일러를 통해 산출물을 보면, 반영효과에 비해 상당히 미비하다. 

4. 커넥션에 드는 비용은 생각보다 크다. 또한, 시스템의 부하는 차치하고서라도, 커넥션 자체에 딜레이 되는 타임은 시스템의 규모에 따라 상당한 장애로 발생한다.
<textarea style="DISPLAY: none" id="save_comment_36321">/jeon1. 트랜잭션은 커넥션 단위라기 보다는 디스커넥트 발생시 자동으로 comit 또는 rollback 등이 발생되는 개념이며, 명시적으로 또는 pool에서 이에 대한 commit / rollback을 지원한다.2. 커넥션 풀의 용도는 가용성이 아니라, 커넥션 생성에 드는 비용을 줄이기 위함이다.3. 속도저하 문제는 막연한 추측만으로 이룰 수 없다. 실제 프로파일러를 통해 산출물을 보면, 반영효과에 비해 상당히 미비하다.4. 커넥션에 드는 비용은 생각보다 크다. 또한, 시스템의 부하는 차치하고서라도, 커넥션 자체에 딜레이 되는 타임은 시스템의 규모에 따라 상당한 장애로 발생한다.</textarea>
오해를 04-12-24 20:13 |삭제
널리 쓰이는데는 그에 합당한 이유가 있기
<textarea style="DISPLAY: none" id="save_comment_36322">널리 쓰이는데는 그에 합당한 이유가 있기 </textarea>
 04-12-25 01:33 |삭제
php에서 pool를 사용하여 
대용량시스템을 구축해보신경험이 있는 분들이 계신가요?? 
 php에서는 널리쓰이질않는건지 궁금합니다.. 

위에 장단점만을 봤을때는 
굳이 pool을 쓸필요가 있을까?  라는 생각이 드네요.
<textarea style="DISPLAY: none" id="save_comment_36323">php에서 pool를 사용하여대용량시스템을 구축해보신경험이 있는 분들이 계신가요??왜 php에서는 널리쓰이질않는건지 궁금합니다..위에 장단점만을 봤을때는굳이 pool을 쓸필요가 있을까? 라는 생각이 드네요.</textarea>
문태준 04-12-25 11:03 |삭제
헤즐넛님이 적으신 글에 비슷한 문서가 있군요. 뭐 그래도 이렇게 한번 더 글을 올리면서 또 생각해볼수 있으니 도움이 되겠죠. 관련된 참고자료를 마지막에 추가하였습니다. 근데 헤즐넛님 어디서 계속 아이디는 본듯한데. 아닌가?
<textarea style="DISPLAY: none" id="save_comment_36324">헤즐넛님이 적으신 글에 비슷한 문서가 있군요. 뭐 그래도 이렇게 한번 더 글을 올리면서 또 생각해볼수 있으니 도움이 되겠죠. 관련된 참고자료를 마지막에 추가하였습니다. 근데 헤즐넛님 어디서 계속 아이디는 본듯한데. 아닌가?</textarea>
전영규 04-12-25 14:01 |삭제
오해를 님에게 ~ 
물론 님이 하신 말씀을 전혀 모르고 글을 올린 것은 아닙니다.. 제게 근거를 요구하셨듯이, 오해를님도 그에 대해 기술적인 근거를 제시할 수 있습니까.. ? 저처럼, 오해를 님도 나름대로의 경험과 지식에 근거할 뿐 아닐까요. 

논쟁을 할 필요까진 없어 보이니까... 님의 생각을 바꾸려 노력하거나 제가 변명하려 노력할 필요는 없어 보이구요. 

위 문제들 다 접어둔다 해도... 4 번 문제, 컨넥션에 드는 비용문제인데요. 
웬만한 DBMS 라면 자체에서 쓰레드풀을 구성하고, 요청에 대해 이 쓰레드풀내에서 컨넥션을 갖지 않나 싶습니다. 
쓰레드 생성 자체에 OS 마다 차이는 있지만 적지않은 부하가 있으니까요. 따라서, DB자체에서 쓰레드풀을 갖고 있는 만큼, 외부에서 별도의 쓰레드풀을 처리할 필요성은 없다고 보여집니다.. 
이 외에, DB 가 처리하는 내부 메모리구조 등과 관련한 컨넥션 초기화에 드는 부하가 있겠지만, 이정도도 역시 DBMS 내에 처리루틴이 어느정도 있다고 생각됩니다. 
이건 고난이도의 \'아이디어\'가 아니라, 아주 평범한 아이디어라서요... ;; 
또한 경험에 의해서도, 오라클이든 mysql이든, 다른 어떤 것이든 컨넥션 자체에 큰 부하를 느껴본 적은 없었습니다...;; 

이에 대해 저도 mysql 소스코드를 들여다보거나, 오라클 에 기술적 문의를 해보거나 한 적은 전혀 없으므로, 그냥 개인적인 \'추측\'일 뿐입니다. 

-- jeon.
<textarea style="DISPLAY: none" id="save_comment_36325">오해를 님에게 ~물론 님이 하신 말씀을 전혀 모르고 글을 올린 것은 아닙니다.. 제게 근거를 요구하셨듯이, 오해를님도 그에 대해 기술적인 근거를 제시할 수 있습니까.. ? 저처럼, 오해를 님도 나름대로의 경험과 지식에 근거할 뿐 아닐까요.논쟁을 할 필요까진 없어 보이니까... 님의 생각을 바꾸려 노력하거나 제가 변명하려 노력할 필요는 없어 보이구요.위 문제들 다 접어둔다 해도... 4 번 문제, 컨넥션에 드는 비용문제인데요.웬만한 DBMS 라면 자체에서 쓰레드풀을 구성하고, 요청에 대해 이 쓰레드풀내에서 컨넥션을 갖지 않나 싶습니다.쓰레드 생성 자체에 OS 마다 차이는 있지만 적지않은 부하가 있으니까요. 따라서, DB자체에서 쓰레드풀을 갖고 있는 만큼, 외부에서 별도의 쓰레드풀을 처리할 필요성은 없다고 보여집니다..이 외에, DB 가 처리하는 내부 메모리구조 등과 관련한 컨넥션 초기화에 드는 부하가 있겠지만, 이정도도 역시 DBMS 내에 처리루틴이 어느정도 있다고 생각됩니다. 이건 고난이도의 \'아이디어\'가 아니라, 아주 평범한 아이디어라서요... ;;또한 경험에 의해서도, 오라클이든 mysql이든, 다른 어떤 것이든 컨넥션 자체에 큰 부하를 느껴본 적은 없었습니다...;;이에 대해 저도 mysql 소스코드를 들여다보거나, 오라클 에 기술적 문의를 해보거나 한 적은 전혀 없으므로, 그냥 개인적인 \'추측\'일 뿐입니다.-- jeon.</textarea>
개씨박 04-12-25 17:40 |삭제
전영규//당연히 고난이도의 아이디어가 아닙니다. 왜냐고요. JAVA에서 JDBC와 주로 쓰이는 것 이고, 웬만한 WAS라면 Connection pool은 필수적으로 있으니까요.
<textarea style="DISPLAY: none" id="save_comment_36326">전영규//당연히 고난이도의 아이디어가 아닙니다. 왜냐고요. JAVA에서 JDBC와 주로 쓰이는 것 이고, 웬만한 WAS라면 Connection pool은 필수적으로 있으니까요.</textarea>
개씨박 04-12-25 17:42 |삭제
전영규//그리고 커넥션풀과, 쓰레드풀과는 전혀 연관이없는듯하군요. 쓰레드가 아무리 많다하더라도, 커넥션을 다시 맺으려면 expensive cost가 들게 되있으니까요.
<textarea style="DISPLAY: none" id="save_comment_36327">전영규//그리고 커넥션풀과, 쓰레드풀과는 전혀 연관이없는듯하군요. 쓰레드가 아무리 많다하더라도, 커넥션을 다시 맺으려면 expensive cost가 들게 되있으니까요.</textarea>
전영규 04-12-26 00:18 |삭제
개씨박님 
따라서 하고 싶은 말은 무엇인가요 ? 
외부에서 따로 구현하는 컨넥션풀에 대해 필요하다고 생각하는 입장인가요 ? 정확히 구분이 안가네요... 
아니면 그것과 관계없이 제 말에 대해 \'평가\' 하는 중인가요 ? 
가능하면 컨넥셕풀의 필요성에 대해 좀 분명한 말씀들을 해주시면 좋겠네요... 

-- jeon.
<textarea style="DISPLAY: none" id="save_comment_36328">개씨박님따라서 하고 싶은 말은 무엇인가요 ?외부에서 따로 구현하는 컨넥션풀에 대해 필요하다고 생각하는 입장인가요 ? 정확히 구분이 안가네요... 아니면 그것과 관계없이 제 말에 대해 \'평가\' 하는 중인가요 ?가능하면 컨넥셕풀의 필요성에 대해 좀 분명한 말씀들을 해주시면 좋겠네요... -- jeon.</textarea>
오해를 04-12-26 02:36 |삭제
/jeon 

기술논쟁에서 제일 까다로운 최소한의 예의를 가장한 오기성 글이군요. (예의가 중요한게 아니라 정작 중요한 기술적인 논리가 부족하다는 의미입니다.) 

mysql은 몰라도 oracle 소스 들여다 보는 개발자들이 몇이나 있을까요? 소스를 들여다 봐야 모든 진리를 알 수 있다면, 대부분의 논쟁은 무의미 해질겁니다. 

4번에 대해 아주 자세한 근거를 대라면, 글쎄요. 커넥션풀 구성 이전과 이후의 프로파일러 레포트를 제출해야 할까요? 그럴 필요까지는 없겠죠. 너무나도 당연한 결과이니까. (또한 이러한 BMT 레포트들은 각 풀 사이트에 가셔도 대부분 상세히 나와 있을겁니다. 이 부분에 대해서 또 다시 왈가불가 할 필요는 없을 듯 합니다. 퍼나르는 노동밖에 되지 않을테니까요.) 

제가 지적한 것은 jeon님께서 추측성으로, 그러나 대부분 옳지않은 내용을 보고, 후배님들께서 \'아 풀은 그다지 유용하지 않은거구나\' 또는 \'트랜잭션등에서 문제가 생길 수 있으니 사용하면 안되겠구나, 오히려 부하가 더 걸릴수 도 있겠는걸.\' 하고 그릇된 판단을 할 수 있기에 지적해 드린 내용입니다. 

프로젝트 종결 후, 완료보고계가 올라가고 여기에는 스트레스 테스트, 프로파일러 레포트, 무결성 점검, 유닛테스트 보고서등이 제출되고, 이 산출물들을 기반으로 감사를 진행하게 되지요. 

제가 말하는 경험이란, 막연한 경험과 노하우를 말씀 드리는 것이 아니라, 실제 풀의 적용 이전과 이후에 따른 위의 절차를 거치면서 나온 결과이고, 전영규님의 경험이란 글쎄요, 단순한 느낌과 top등과 같은 간략한 시스템 트레이스 툴 정도를 이용한 추측 정도로 밖엔 보이지 않습니다. 이는 한번이라도 구체적인 레포트를 작성해 봤다면, 너무나도 숫자적으로 확연히 차이가 벌어지는 결과물이라 논쟁의 의미가 없어 보입니다. 

또한 기술적인 근거라 할 수는 없겠지만, 데이터베이스 관련 부분은 해당 프로덕트의 로컬 매니저들에게 감사를 받고, 최종적인 튜닝에 대한 자문도 구하는 단계에서 축적된 경험(jeon님께서 언급하신 기술적 문의등은 너무나도 당연히 이루어지겠지만, 그래도 단순한 경험에 분류될 뿐입니다. 예를들어, 오라클 소속 엔지니어라 해도, 담당 엔지니어의 성향이나 자질의 문제에 따라 상이한 결과가 나오기 때문이죠.), 또는 직접 테스트 유닛을 만들면서, 프로파일링을 할 가치조차 못 느낄 형편없는 결과물을 나왔었던 이러한 \'안\' 좋았던 개인적인 경험을 제시할 수 있겠군요. 아시다시피 사람들은 끔찍했던 원인에 대해선 보다 선명히 기억하니까요. 

논쟁이라는 것이 막연한 추측만으론 정말 곤란합니다.  더군다나 이렇게 오픈된 자료들이 충만한 내용에 대해서도, 명확한 근거를 제시하라란 식의 말씀은 아무런 의미가 없어 보입니다. 

마치 태권도가 왜 몸에 좋은가?에 대해 명확한 의미를 제시하라 한다면, 단순히 검색엔진에서 \'태권도\' 라고 쳐 보거나, 태권도 협회 사이트에 들어가라고 밖엔 할말이 없겠죠. (커넥션풀에 대해서도 같은 답변을 드리고 싶습니다.)
<textarea style="DISPLAY: none" id="save_comment_36329">/jeon기술논쟁에서 제일 까다로운 최소한의 예의를 가장한 오기성 글이군요. (예의가 중요한게 아니라 정작 중요한 기술적인 논리가 부족하다는 의미입니다.)mysql은 몰라도 oracle 소스 들여다 보는 개발자들이 몇이나 있을까요? 소스를 들여다 봐야 모든 진리를 알 수 있다면, 대부분의 논쟁은 무의미 해질겁니다.4번에 대해 아주 자세한 근거를 대라면, 글쎄요. 커넥션풀 구성 이전과 이후의 프로파일러 레포트를 제출해야 할까요? 그럴 필요까지는 없겠죠. 너무나도 당연한 결과이니까. (또한 이러한 BMT 레포트들은 각 풀 사이트에 가셔도 대부분 상세히 나와 있을겁니다. 이 부분에 대해서 또 다시 왈가불가 할 필요는 없을 듯 합니다. 퍼나르는 노동밖에 되지 않을테니까요.)제가 지적한 것은 jeon님께서 추측성으로, 그러나 대부분 옳지않은 내용을 보고, 후배님들께서 \'아 풀은 그다지 유용하지 않은거구나\' 또는 \'트랜잭션등에서 문제가 생길 수 있으니 사용하면 안되겠구나, 오히려 부하가 더 걸릴수 도 있겠는걸.\' 하고 그릇된 판단을 할 수 있기에 지적해 드린 내용입니다.프로젝트 종결 후, 완료보고계가 올라가고 여기에는 스트레스 테스트, 프로파일러 레포트, 무결성 점검, 유닛테스트 보고서등이 제출되고, 이 산출물들을 기반으로 감사를 진행하게 되지요.제가 말하는 경험이란, 막연한 경험과 노하우를 말씀 드리는 것이 아니라, 실제 풀의 적용 이전과 이후에 따른 위의 절차를 거치면서 나온 결과이고, 전영규님의 경험이란 글쎄요, 단순한 느낌과 top등과 같은 간략한 시스템 트레이스 툴 정도를 이용한 추측 정도로 밖엔 보이지 않습니다. 이는 한번이라도 구체적인 레포트를 작성해 봤다면, 너무나도 숫자적으로 확연히 차이가 벌어지는 결과물이라 논쟁의 의미가 없어 보입니다.또한 기술적인 근거라 할 수는 없겠지만, 데이터베이스 관련 부분은 해당 프로덕트의 로컬 매니저들에게 감사를 받고, 최종적인 튜닝에 대한 자문도 구하는 단계에서 축적된 경험(jeon님께서 언급하신 기술적 문의등은 너무나도 당연히 이루어지겠지만, 그래도 단순한 경험에 분류될 뿐입니다. 예를들어, 오라클 소속 엔지니어라 해도, 담당 엔지니어의 성향이나 자질의 문제에 따라 상이한 결과가 나오기 때문이죠.), 또는 직접 테스트 유닛을 만들면서, 프로파일링을 할 가치조차 못 느낄 형편없는 결과물을 나왔었던 이러한 \'안\' 좋았던 개인적인 경험을 제시할 수 있겠군요. 아시다시피 사람들은 끔찍했던 원인에 대해선 보다 선명히 기억하니까요.논쟁이라는 것이 막연한 추측만으론 정말 곤란합니다. 더군다나 이렇게 오픈된 자료들이 충만한 내용에 대해서도, 명확한 근거를 제시하라란 식의 말씀은 아무런 의미가 없어 보입니다. 마치 태권도가 왜 몸에 좋은가?에 대해 명확한 의미를 제시하라 한다면, 단순히 검색엔진에서 \'태권도\' 라고 쳐 보거나, 태권도 협회 사이트에 들어가라고 밖엔 할말이 없겠죠. (커넥션풀에 대해서도 같은 답변을 드리고 싶습니다.)</textarea>
훔.. 04-12-26 11:16 |삭제
오해를 / 적당한 설명이라고 봅니다. 
--- 
커넥션풀에서 커넥션이 이루어 지고 끊어지는 부분에 대한 소비를 mysql 문서에 보면 일반적인 쿼리 보다 몇배가 더 소비된다고 나와있습니다. 대부분의 DB들이 실제 쿼리에 대한 처리량에 고심하고 있다는것을 본다면 커넥션부분에 대한 의존도를 다른 프로그램에서 처리해준다면 더할나위 없이 기쁘겠죠..    게다가 풀을 만들면 다용도로 쓸수 있습니다.  여러 DB 서버를 활용할수 있고, 커넥션 이벤트 또는 디스 커넥션 이벤트에 따른 임의 사용자 프로그램 개발도 용이 하고.. 기타 등등.. 

단순히 DB, 여기서 mysql에서의 쓰레드 방식과 커넥션풀을 비교 하는거 자체가 무리라고 보여집니다.  전님이 말씀 하신 형태라면 몇천만원이나 들이면서 미들웨어를 구입하는 사람들이 골빈 사람들이 되어 버리는 꼴이 될꺼 같다고 보여집니다.. 

특히나 4번 사항에 대한 설명은 적절치 않습니다.. DB 활용에 따라 다른, 즉. 쿼리를 길게 잡고있는 놈들고 있고, 단타로 절라 많이 요청하는 것들도 있는데.. 그렇게 무턱대고 \"별로 없더라\" 식의 내용은 좀 이해가 안가네요... 정말 많은 수의 짧은 요청을 감당하는 경우도 있다는걸 염두에 두셔야 할것 같습니다. 

좀더 자세한 사항을 알고 싶으면 미들웨어 프로그램의 feature 부분을 보시는것도 좋겠네요..
<textarea style="DISPLAY: none" id="save_comment_36330">오해를 / 적당한 설명이라고 봅니다.---커넥션풀에서 커넥션이 이루어 지고 끊어지는 부분에 대한 소비를 mysql 문서에 보면 일반적인 쿼리 보다 몇배가 더 소비된다고 나와있습니다. 대부분의 DB들이 실제 쿼리에 대한 처리량에 고심하고 있다는것을 본다면 커넥션부분에 대한 의존도를 다른 프로그램에서 처리해준다면 더할나위 없이 기쁘겠죠.. 게다가 풀을 만들면 다용도로 쓸수 있습니다. 여러 DB 서버를 활용할수 있고, 커넥션 이벤트 또는 디스 커넥션 이벤트에 따른 임의 사용자 프로그램 개발도 용이 하고.. 기타 등등..단순히 DB, 여기서 mysql에서의 쓰레드 방식과 커넥션풀을 비교 하는거 자체가 무리라고 보여집니다. 전님이 말씀 하신 형태라면 몇천만원이나 들이면서 미들웨어를 구입하는 사람들이 골빈 사람들이 되어 버리는 꼴이 될꺼 같다고 보여집니다..특히나 4번 사항에 대한 설명은 적절치 않습니다.. DB 활용에 따라 다른, 즉. 쿼리를 길게 잡고있는 놈들고 있고, 단타로 절라 많이 요청하는 것들도 있는데.. 그렇게 무턱대고 \"별로 없더라\" 식의 내용은 좀 이해가 안가네요... 정말 많은 수의 짧은 요청을 감당하는 경우도 있다는걸 염두에 두셔야 할것 같습니다.좀더 자세한 사항을 알고 싶으면 미들웨어 프로그램의 feature 부분을 보시는것도 좋겠네요..</textarea>
훔.. 04-12-26 11:18 |삭제
아 추가로 개인적으로는 
일반적인 사용에서는 개인이 커넥션풀까지 쓸 일은 거의 없다라고 느낍니다..  이 상황에서는 전님의 의견과 비슷한 부분이 되겠죠....  물론 대형DB에서는 틀리구요..
<textarea style="DISPLAY: none" id="save_comment_36331">아 추가로 개인적으로는일반적인 사용에서는 개인이 커넥션풀까지 쓸 일은 거의 없다라고 느낍니다.. 이 상황에서는 전님의 의견과 비슷한 부분이 되겠죠.... 물론 대형DB에서는 틀리구요..</textarea>
우와 04-12-26 11:29 |삭제
전영규님께 대규모 프로젝트를 해보았는지 여쭤보고 싶습니다. 
몇번의 컨넥션만 이루어지는 단순한 작업은 컨넥션 풀을 
쓸필요는 없지만 대규모 프로젝트에서는 상당히 많은 
컨넥션이 요청될 경우 수많은 컨넥션이 동시에 생기면서 
데이터베이스가 죽는 상황도 생깁니다. 
그렇기 때문에 컨넥션 풀을 사용하는거지요. 
그리고 컨넥션 풀에 대해서 몇가지 잘못 알고 계신 것 같은데요. 
오해를 님이 적절하게 잘 설명해주신 것 같아서 
따로 드릴 말씀은 없네요. 컨넥션 풀은 이미 많은 곳에 
적용되어 있고 상용 WAS 에서도 지원하고 있습니다. 
그 효능은 이미 입증되었다고 봐도 괜찮을 것 같습니다.
<textarea style="DISPLAY: none" id="save_comment_36332">전영규님께 대규모 프로젝트를 해보았는지 여쭤보고 싶습니다.몇번의 컨넥션만 이루어지는 단순한 작업은 컨넥션 풀을 쓸필요는 없지만 대규모 프로젝트에서는 상당히 많은컨넥션이 요청될 경우 수많은 컨넥션이 동시에 생기면서데이터베이스가 죽는 상황도 생깁니다.그렇기 때문에 컨넥션 풀을 사용하는거지요.그리고 컨넥션 풀에 대해서 몇가지 잘못 알고 계신 것 같은데요.오해를 님이 적절하게 잘 설명해주신 것 같아서따로 드릴 말씀은 없네요. 컨넥션 풀은 이미 많은 곳에적용되어 있고 상용 WAS 에서도 지원하고 있습니다.그 효능은 이미 입증되었다고 봐도 괜찮을 것 같습니다.</textarea>
전영규 04-12-26 13:02 |삭제
위에 제게 반박글 써주신 분들께 감사드립니다. 
윗분들 말대로 커넥션풀이란 미들웨어를 씀으로서 얻는 컨넥션 부하 단축의 효과가 있을 거란 것은 전혀 무시하는 바가 아닙니다. 
그러나, 과연 그 효과가 어느정도인지 구체적으로 아시는 분 계십니까 ? 
뭐, 10% 향상이라던가 400% 향상이라던가. 
그리고, 이게 벤더의 말이 아니라, 실제로 테스트를 진행하여 얻은 결과인지도 알고 싶군요. 
제가 제 경험과 추측으로 글을 쓰는 것은 순전히 \'제 의견\' 일 수 있습니다. 그러나 여러분들이 쓰는 글은 \'벤더\'와 \'일반적인 선배들의 지침\'에 의존하는 것은 아닌지 더욱 궁금해집니다. 

오기를 부리는 것이라고 생각되시나요 ? 
전혀 그렇지 않습니다. 
저는 오히려 궁금한 것이 있는데, 확실한 답을 구할 수 없기 때분에 답답합니다. 확실한 답이 구해지면, 저도 제가 잘못 알고 있다는 것을 당당히 인정할 수 있고, 이 코멘트들을 읽게 될 다른 후배들(?)에게도 좋은 간접경험과 지식이 될 것입니다. 
그러나, 확실한 답을 구할 수 없다면, 
여전히 저는 제 생각을 멈출 수 없을테고, 여러분은 또 여러분대로 답답한 마음으로 저를 바라볼 겁니다. 
계속해서 \'답답하다\'고 토로하는 것은 의미가 없습니다. 
구체적인 수치를 제시할 수 있습니까 ? 
그렇지 않다면 본 토론은 진전이 없습니다. 

위에 글들을 자세히 읽어 보세요. 제가 했던 말이나 여러분이 했던 말이나 계속 반복되고 확장 될 뿐, 다른 안건이 제시되지 않고 있습니다. 


-- jeon.
<textarea style="DISPLAY: none" id="save_comment_36333">위에 제게 반박글 써주신 분들께 감사드립니다.윗분들 말대로 커넥션풀이란 미들웨어를 씀으로서 얻는 컨넥션 부하 단축의 효과가 있을 거란 것은 전혀 무시하는 바가 아닙니다.그러나, 과연 그 효과가 어느정도인지 구체적으로 아시는 분 계십니까 ?뭐, 10% 향상이라던가 400% 향상이라던가.그리고, 이게 벤더의 말이 아니라, 실제로 테스트를 진행하여 얻은 결과인지도 알고 싶군요.제가 제 경험과 추측으로 글을 쓰는 것은 순전히 \'제 의견\' 일 수 있습니다. 그러나 여러분들이 쓰는 글은 \'벤더\'와 \'일반적인 선배들의 지침\'에 의존하는 것은 아닌지 더욱 궁금해집니다.오기를 부리는 것이라고 생각되시나요 ?전혀 그렇지 않습니다.저는 오히려 궁금한 것이 있는데, 확실한 답을 구할 수 없기 때분에 답답합니다. 확실한 답이 구해지면, 저도 제가 잘못 알고 있다는 것을 당당히 인정할 수 있고, 이 코멘트들을 읽게 될 다른 후배들(?)에게도 좋은 간접경험과 지식이 될 것입니다.그러나, 확실한 답을 구할 수 없다면,여전히 저는 제 생각을 멈출 수 없을테고, 여러분은 또 여러분대로 답답한 마음으로 저를 바라볼 겁니다.계속해서 \'답답하다\'고 토로하는 것은 의미가 없습니다.구체적인 수치를 제시할 수 있습니까 ? 그렇지 않다면 본 토론은 진전이 없습니다.위에 글들을 자세히 읽어 보세요. 제가 했던 말이나 여러분이 했던 말이나 계속 반복되고 확장 될 뿐, 다른 안건이 제시되지 않고 있습니다.-- jeon.</textarea>
우와 04-12-26 13:57 |삭제
까다로운 분이시네요. 
말씀하시는대로 하자면 두개의 알고리즘이 있는데 
그 중 하나의 알고리즘이 성능이 다른 하나보다 떨어질 경우 
성능이 좋은 알고리즘이 과연 안좋은 알고리즘의 정확히 
몇배의 효율을 가지고 있는지 아주 정확히 따지고 씁니까? 
그리고 풀링의 장점들은 이미 위에서도 설명되었고 더 정확한 
자료는 검색해보면 많이 나옵니다. 더욱더 정확한 답을 
원하신다면 더 드릴 말씀은 없습니다. 언젠가 본인이 
직접 경험해보면 알게될겁니다. :)
<textarea style="DISPLAY: none" id="save_comment_36334">까다로운 분이시네요.말씀하시는대로 하자면 두개의 알고리즘이 있는데그 중 하나의 알고리즘이 성능이 다른 하나보다 떨어질 경우성능이 좋은 알고리즘이 과연 안좋은 알고리즘의 정확히몇배의 효율을 가지고 있는지 아주 정확히 따지고 씁니까?그리고 풀링의 장점들은 이미 위에서도 설명되었고 더 정확한자료는 검색해보면 많이 나옵니다. 더욱더 정확한 답을원하신다면 더 드릴 말씀은 없습니다. 언젠가 본인이직접 경험해보면 알게될겁니다. :)</textarea>
명랑폐인 04-12-26 19:50 |삭제
풀의 개념은 성능 향샹이라는 목적도 있지만, 가용 자원을 제한할려는 목적도 있습니다. 

mysql 이 과부하로 사이트 자체가 죽어버리는 것보다 , 어느정도 사용자가 증가하면(connection 개수가 증가하면) 특정 컨텐츠나 서비스에 더이상 사용자가 접근하지 않도록 할수도 있는거죠. 

동일 mysql를 쓰는 사이트에서, A 서비스가 max 10개의 컨넥션을 쓰고, B서비스가 max 10개의 컨넥션, C에서 max 10개의 컨넥션을 쓴다고 했을때, A서비스에 10개 이상의 접속요청이 들어오더라도 B,C에서는 정상적으로 서비스가 되죠. A에서 컨넥션을 다 소비해버려서 A,B,C 서비스 모두가 중단되는 경우는 안생기는거죠. 게시판의 경우 mysql로 쓰는경우가 많은데, 사용자 접속이 특히 많은 게시판만 따로 pool을 구성해서 쓰다면, 게시판 접속이 폭주해서 사이트가 마비되는 경우를 막을수 있겠죠. 

php에서 connection 풀을 제대로 사용할수 있다면, 쓰는게 훨씬 좋습니다. 

그런데,, php가 apache의 fork 기반(아파치2.0은 제외) 프로세스를 쓴다면 컨넥션 풀을 사용하기 위해서 socket나 pipe 로 연결을 해야 할텐데..여기에 과부하가 걸리면 어떻게 되는건지? 쉐어드 메모리를 통해서 서비스 되는것인지. 

그리고, 풀 자체가 c로 작성된 데몬 같은데, 풀이 오류로 죽어버리면 어떻게 되죠? 그만큼 안정성에 문제가 없어야 할것 같은데.. 프로세스 기반으로 작동되는 apache에서 pool 이라는 개념이 잘 안 맞는것 같네요.
<textarea style="DISPLAY: none" id="save_comment_36335">풀의 개념은 성능 향샹이라는 목적도 있지만, 가용 자원을 제한할려는 목적도 있습니다.mysql 이 과부하로 사이트 자체가 죽어버리는 것보다 , 어느정도 사용자가 증가하면(connection 개수가 증가하면) 특정 컨텐츠나 서비스에 더이상 사용자가 접근하지 않도록 할수도 있는거죠.동일 mysql를 쓰는 사이트에서, A 서비스가 max 10개의 컨넥션을 쓰고, B서비스가 max 10개의 컨넥션, C에서 max 10개의 컨넥션을 쓴다고 했을때, A서비스에 10개 이상의 접속요청이 들어오더라도 B,C에서는 정상적으로 서비스가 되죠. A에서 컨넥션을 다 소비해버려서 A,B,C 서비스 모두가 중단되는 경우는 안생기는거죠. 게시판의 경우 mysql로 쓰는경우가 많은데, 사용자 접속이 특히 많은 게시판만 따로 pool을 구성해서 쓰다면, 게시판 접속이 폭주해서 사이트가 마비되는 경우를 막을수 있겠죠.php에서 connection 풀을 제대로 사용할수 있다면, 쓰는게 훨씬 좋습니다. 그런데,, php가 apache의 fork 기반(아파치2.0은 제외) 프로세스를 쓴다면 컨넥션 풀을 사용하기 위해서 socket나 pipe 로 연결을 해야 할텐데..여기에 과부하가 걸리면 어떻게 되는건지? 쉐어드 메모리를 통해서 서비스 되는것인지.그리고, 풀 자체가 c로 작성된 데몬 같은데, 풀이 오류로 죽어버리면 어떻게 되죠? 그만큼 안정성에 문제가 없어야 할것 같은데.. 프로세스 기반으로 작동되는 apache에서 pool 이라는 개념이 잘 안 맞는것 같네요.</textarea>
우와 04-12-26 23:10 |삭제
명랑폐인님 말씀이 맞아 보이는군요. 저희가 토론해야 될것은 
전영규님처럼 정확히 어느정도 효율이 있는지를 따지기 보다는 
과연 프로세스 기반에서의 풀이 과연 효율적인지를 따져보는 
것이 옳은게 아닐까요?
<textarea style="DISPLAY: none" id="save_comment_36336">명랑폐인님 말씀이 맞아 보이는군요. 저희가 토론해야 될것은전영규님처럼 정확히 어느정도 효율이 있는지를 따지기 보다는과연 프로세스 기반에서의 풀이 과연 효율적인지를 따져보는것이 옳은게 아닐까요?</textarea>
네오플 04-12-27 08:01 |삭제
명량폐인에 동감
<textarea style="DISPLAY: none" id="save_comment_36337">명량폐인에 동감</textarea>
전영규 04-12-27 11:50 |삭제
우와님께 
제가 좀 까다로운 면이 있습니다. 개발자라면, 까다로울 때 까다로워야 하는 거 아닌가 싶군요. 
그 알고리즘이 효율적이지 않다는 것은 위에 제가 처음 코멘트 단 것에 이미 밝혔고, 그 이후에도 계속 같은 입장입니다. 
그렇기 때문에, 수치 데이타가 없다면 별로 라는 입장이구요. 

명량폐인님 말씀엔 당연히 동의합니다. 
새로운 관점에서 컨넥션풀을 바라보는 방법을 주셨네요. 
맞습니다. db 서버는 1 개 이고, 이에 접속하는 아파치나 어플이 다수일 때 컨넥션풀은 각각의 접속서버에서 제한을 주는 용도로 사용될 수 있을 것입니다. 
여러 경우의 수가 있겠지만, 전반적으로 이 아이디어는 유용하다고 보여집니다. 

그러나, 명량폐인님 역시 그 이후 말씀에서  컨넥션풀 자체의 유용성에 대해서는 다시 적절한 수용이 필요하다는 언급을 하셨군요. 

비온뒤 님께. 제 생각엔 필요없다 입니다. 

-- jeon.
<textarea style="DISPLAY: none" id="save_comment_36338">우와님께제가 좀 까다로운 면이 있습니다. 개발자라면, 까다로울 때 까다로워야 하는 거 아닌가 싶군요.그 알고리즘이 효율적이지 않다는 것은 위에 제가 처음 코멘트 단 것에 이미 밝혔고, 그 이후에도 계속 같은 입장입니다.그렇기 때문에, 수치 데이타가 없다면 별로 라는 입장이구요.명량폐인님 말씀엔 당연히 동의합니다.새로운 관점에서 컨넥션풀을 바라보는 방법을 주셨네요.맞습니다. db 서버는 1 개 이고, 이에 접속하는 아파치나 어플이 다수일 때 컨넥션풀은 각각의 접속서버에서 제한을 주는 용도로 사용될 수 있을 것입니다.여러 경우의 수가 있겠지만, 전반적으로 이 아이디어는 유용하다고 보여집니다.그러나, 명량폐인님 역시 그 이후 말씀에서 컨넥션풀 자체의 유용성에 대해서는 다시 적절한 수용이 필요하다는 언급을 하셨군요. 비온뒤 님께. 제 생각엔 필요없다 입니다.-- jeon.</textarea>
전영규 04-12-27 11:55 |삭제
명량폐인님께... 
이건 다소 본 토론과 별 관계가 없는 거라서.. 언급을 피하고 싶은 부분이긴 한데요. 
php가 apache의 fork 기반(아파치2.0은 제외) 프로세스를 쓴다면 컨넥션 풀을 사용하기 위해서 socket나 pipe 로 연결을 해야 할텐데..여기에 과부하가 걸리면 어떻게 되는건지? 
--> 쓰레드 기반이라도 socket나 pipe 로 연결을 해야겠지요. ipc 프로토콜로 알려져 있다면, 쓰레드도 부모 프로세스기반이므로, ipc 프로토콜을 벗어날 수가 없으니까요.. 
따라서, 프로세스기반이기 때문에 컨넥션풀이 안좋다.. 라는 건 적절한 결론이 아닙니다.. ;; 
이후 와우 님께도 마찬가지 말씀을 드리고 싶군요. 

그보다는, 컨넥션 풀 자체의 안정성이나 부하문제, 컨넥션타임을 과연 얼마나 줄여줄 것인가에 대한 수치데이타 문제 등이 여전히 중요변수 아닐까요... 


-- jeon.
<textarea style="DISPLAY: none" id="save_comment_36339">명량폐인님께... 이건 다소 본 토론과 별 관계가 없는 거라서.. 언급을 피하고 싶은 부분이긴 한데요.php가 apache의 fork 기반(아파치2.0은 제외) 프로세스를 쓴다면 컨넥션 풀을 사용하기 위해서 socket나 pipe 로 연결을 해야 할텐데..여기에 과부하가 걸리면 어떻게 되는건지?--> 쓰레드 기반이라도 socket나 pipe 로 연결을 해야겠지요. ipc 프로토콜로 알려져 있다면, 쓰레드도 부모 프로세스기반이므로, ipc 프로토콜을 벗어날 수가 없으니까요..따라서, 프로세스기반이기 때문에 컨넥션풀이 안좋다.. 라는 건 적절한 결론이 아닙니다.. ;;이후 와우 님께도 마찬가지 말씀을 드리고 싶군요.그보다는, 컨넥션 풀 자체의 안정성이나 부하문제, 컨넥션타임을 과연 얼마나 줄여줄 것인가에 대한 수치데이타 문제 등이 여전히 중요변수 아닐까요... -- jeon.</textarea>
하늘너굴 04-12-27 13:44 |삭제
혹시 도움이 될까 몇자 적어 봅니다. 
저희는 php 에  oracle9i를 이용하고 있습니다. 

현재는 php DB pooling 중 sqlrelay를 이용하고 있습니다. 

테스트 머신 : X86 Linux (Redhat) 
DB : oracle 9i 
LANG : php 

이용 목적: 
1. php 에서 oracle9i의 disconnect 가 제대로 안되는 문제와 
2. 사용자가 몰렸을 경우 위의 문제로 db connect 을 많이 물게되어 db 서버의 리소스를 많이 잡는 문제 


장점과 테스트시 향상율 
1. db 서버의 부하감소 20% 
2. 속도향상(ab를 이용 테스트 10~20% 향상됨) 
3. 웹서버의 메모리 사용량 감소.. 
(이부분은 기존의 oracle 펑션을 이용하지 않고 sqlrelay의 펑션를 이용하면서 아마도 오라클 클라이언트 모듈이 로딩되지 않아서 일까 추측 됩니다. 예전에는 httpd 데몬 하나가  50M 이상 잡아먹던게 5~6M가로 줄었습니다.) 
덕분에..  웹서버의 메모리 사용량도 줄이게 됐습니다. 

단점 
1. 단점이라면 아직 오라클(오라클만 테스트해봤음^^)을 제대로 지원하지 못하는 문제 

단점보다는 우리쪽에 장점이 많아 올 8월 부터 지금까지 쭈욱 이용하고 있습니다.
<textarea style="DISPLAY: none" id="save_comment_36340">혹시 도움이 될까 몇자 적어 봅니다.저희는 php 에 oracle9i를 이용하고 있습니다.현재는 php DB pooling 중 sqlrelay를 이용하고 있습니다.테스트 머신 : X86 Linux (Redhat)DB : oracle 9iLANG : php이용 목적:1.php 에서 oracle9i의 disconnect 가 제대로 안되는 문제와 2. 사용자가 몰렸을 경우 위의 문제로 db connect 을 많이 물게되어 db 서버의 리소스를 많이 잡는 문제장점과 테스트시 향상율 1. db 서버의 부하감소 20%2. 속도향상(ab를 이용 테스트 10~20% 향상됨)3. 웹서버의 메모리 사용량 감소..(이부분은 기존의 oracle 펑션을 이용하지 않고 sqlrelay의 펑션를 이용하면서 아마도 오라클 클라이언트 모듈이 로딩되지 않아서 일까 추측 됩니다. 예전에는 httpd 데몬 하나가 50M 이상 잡아먹던게 5~6M가로 줄었습니다.)덕분에.. 웹서버의 메모리 사용량도 줄이게 됐습니다.단점1. 단점이라면 아직 오라클(오라클만 테스트해봤음^^)을 제대로 지원하지 못하는 문제단점보다는 우리쪽에 장점이 많아 올 8월 부터 지금까지 쭈욱 이용하고 있습니다.</textarea>
음~~냐 04-12-27 14:46 |삭제
몬아라드꺼따...@.@
<textarea style="DISPLAY: none" id="save_comment_36341">몬아라드꺼따...@.@</textarea>
전영규 04-12-27 15:40 |삭제
하늘너굴님 좋은 자료 감사드립니다. 
크게 보아 20% 정도 향상이 있다고 보여지네요. 
그리고 조언드리자면.. 
disconnect 가 잘 안되는 현상은 php 나 오라클쪽 설정문제를 좀 더 보시면 해결되지 않을까 싶네요. 저는 그런 현상을 거의 보지 못했었는데... 아마 특수상황이 아닐까 싶습니다. 

3.번 사항은 .. 정말 그렇다면 큰 수확이군요. 
그런데 역시 일반상황은 아닐 거 같다는 생각이 드네요.. ;; 
httpd 데몬 하나가 50M 이상 잡아먹는 상황이 해소된 상태라면.. 아마 성능향상도 이 메모리해소에 맞물려 이룩된 성과일 지 모릅니다. 
따라서, sqlrelay 를 쓰지 않고서 php-oracle 간 조율을 해주면 현재 이룩한 성과와 같은 성과를 얻을 수도 있겠다는 생각이 듭니다. 
물론, 현재 잘 쓰고 있다면 굳이 그런 실험을 하실 필요는 없겠지만요.... ;; 

-- jeon.
<textarea style="DISPLAY: none" id="save_comment_36342">하늘너굴님 좋은 자료 감사드립니다.크게 보아 20% 정도 향상이 있다고 보여지네요.그리고 조언드리자면..disconnect 가 잘 안되는 현상은 php 나 오라클쪽 설정문제를 좀 더 보시면 해결되지 않을까 싶네요. 저는 그런 현상을 거의 보지 못했었는데... 아마 특수상황이 아닐까 싶습니다.3.번 사항은 .. 정말 그렇다면 큰 수확이군요.그런데 역시 일반상황은 아닐 거 같다는 생각이 드네요.. ;;httpd 데몬 하나가 50M 이상 잡아먹는 상황이 해소된 상태라면.. 아마 성능향상도 이 메모리해소에 맞물려 이룩된 성과일 지 모릅니다.따라서, sqlrelay 를 쓰지 않고서 php-oracle 간 조율을 해주면 현재 이룩한 성과와 같은 성과를 얻을 수도 있겠다는 생각이 듭니다.물론, 현재 잘 쓰고 있다면 굳이 그런 실험을 하실 필요는 없겠지만요.... ;;-- jeon.</textarea>
명랑폐인 04-12-27 15:57 |삭제
전영규//쓰레드 기반이라도 socket이나 pipe로 연결하는게 맞습니다. 제가 예를 잘못 들었네요.. 웹서버가(apache나 tomcat같은) 직접 pool을 관리하는 형태가 아니라면, socket이나 pipe로 연결하는 것입니다. 

자바의 경우 어플리케이션 내부적으로 pool을 관리함으로, 코드에서 메소드만 호출하면 pool을 사용할수 있습니다. 

그러니까 apache 서버에서 직접 pool을 관리하는 형태가 아니라면, php가 풀 demon 에게 socket 이나 pipe로 연결하여 쓰는 형태라면, 그에 따른 부하처리는 어떻게 할수 있느냐 하는것입니다.  php프로세스가 증가하고, 데몬에 접속하는 socket이나 pipe도 늘어날텐데.. 이것도 성능에 영향을 끼칠수 있다는 것입니다.
<textarea style="DISPLAY: none" id="save_comment_36343">전영규//쓰레드 기반이라도 socket이나 pipe로 연결하는게 맞습니다. 제가 예를 잘못 들었네요.. 웹서버가(apache나 tomcat같은) 직접 pool을 관리하는 형태가 아니라면, socket이나 pipe로 연결하는 것입니다.자바의 경우 어플리케이션 내부적으로 pool을 관리함으로, 코드에서 메소드만 호출하면 pool을 사용할수 있습니다.그러니까 apache 서버에서 직접 pool을 관리하는 형태가 아니라면, php가 풀 demon 에게 socket 이나 pipe로 연결하여 쓰는 형태라면, 그에 따른 부하처리는 어떻게 할수 있느냐 하는것입니다. php프로세스가 증가하고, 데몬에 접속하는 socket이나 pipe도 늘어날텐데.. 이것도 성능에 영향을 끼칠수 있다는 것입니다.</textarea>
전영규 04-12-27 21:58 |삭제
물론이지요. 
단지 명량폐인님 말씀처럼 쓰레드라고 해서 ipc 를 소켓이나 파이프 아닌 다른 것으로 하는 것은 아닌데, 그에 대한 것만 지적해 드린 것이구요 

말씀처럼, 컨넥션풀은 기본적인 부하가 있습니다. 
그에 대한 것을 앞에 계속 말씀드렸던 것이구요... 

제가 쓴 첫 글에서 3 번 항목과 유사한 사항이네요.. 
3. 컨넥션풀의 미들웨어(!)를 쓸 때 발생하는 속도저하문제... 

-- jeon.
<textarea style="DISPLAY: none" id="save_comment_36344">물론이지요.단지 명량폐인님 말씀처럼 쓰레드라고 해서 ipc 를 소켓이나 파이프 아닌 다른 것으로 하는 것은 아닌데, 그에 대한 것만 지적해 드린 것이구요말씀처럼, 컨넥션풀은 기본적인 부하가 있습니다.그에 대한 것을 앞에 계속 말씀드렸던 것이구요... 제가 쓴 첫 글에서 3 번 항목과 유사한 사항이네요..3. 컨넥션풀의 미들웨어(!)를 쓸 때 발생하는 속도저하문제...-- jeon.</textarea>
전영규 04-12-27 21:59 |삭제
위에 .. 4번과도 관련이 있지만, 3번에 더 관련이 있다는 뜻입니다... 
-- jeon.
<textarea style="DISPLAY: none" id="save_comment_36345">위에 .. 4번과도 관련이 있지만, 3번에 더 관련이 있다는 뜻입니다...-- jeon.</textarea>
고인돌유령되다 04-12-28 05:58 |삭제
문태준님의 글을 이곳 php 커뮤니티에서 보게되다니...ㅇㅇ 
팬입니다. :ㅡ)
<textarea style="DISPLAY: none" id="save_comment_36346">문태준님의 글을 이곳 php 커뮤니티에서 보게되다니...ㅇㅇ팬입니다. :ㅡ)</textarea>
문태준 04-12-28 14:17 |삭제
php, mysql 관련된 사이트에서 커넥션 풀링과 관련된 자료를 찾아보아도 그다지 자료가 나오는게 없군요. 위에 토론을 보다보니 궁금해지기는 해서요. 
저야 자세한 내용까지는 모르겠지만 전영규님 말대로 정확한 근거와 수치를 제시하는것은 필요하다는 생각이 들어요. 저도 잘 못하는 것이기는 하지만 이렇게 이렇게 하는것이 더 좋지 않겠냐는 말은 막연한 것이 있지요. (그래도 아무런 말을 하지 않는것도바는 막연하게라도 표현하는게 더 낫긴한데...) 

전영규님이 다른 분들한테 계속 억지주장을 하는게 아니라 사람들이 커넥션 풀이 유용하다고 하는데 그에 대한 실증적인 내용과 분명한 근거를 알고 싶다는 의견같네요. 맞나요? 

좀 다른 이야기지만 이런 것도 있지요. 예를 들어 http 1.1 에서는 keepalive를 지원하며 웹서버에 접속한 경우 일정한 시간동안 연결을 유지시켜줍니다. 그런데 사이트에 접속자가 많으면 오히려 유휴프로세서를 많이 생기게하여 문제를 발생시키는 경우가 생깁니다. keepalive를 off로 하면 시스템상에서 프로세서를 더 자주 생성시키고 소멸시키기때문에 시스템의 부하는 전체적으로 높여지지만 오히려 웹성능자체는 향상될수가 있습니다. 지속적인 연결을 하는 것과 tiemout 값이 접속자가 많은 경우 상당히 많은 영향을 미치지요. 

DB에서 새로 DB프로세서를 생성하는것이 쿼리를 실행하는 것에 비하면 더 부하를 주는 것이지만 이것이 정말 심각할 정도로 영향을 주는 문제인가 이런 궁금함이 생기네요. 

커넥션 풀이 나름대로의 장점을 가지고 있다고 하더라도 정말 이것이 커넥션풀을 쓰지 않는 것에 비하여 엄청나게 많은 장점을 가지고 있는것인지 이런 의문은 충분히 가질수 있다는 생각이 듭니다. 

좀더 나아가면 어떤 경우에 커넥션풀을 쓰는게 더 적합한지 이런 것을 생각할 수 있을듯. 여러가지 경우에 따라 적합한 것이 다를 수 있으니깐요. 

하늘너굴님이 올린 자료는 좀더 실증적인 자료인데 예를 들어 벤치마킹을 한다면 동시사용자를 올리면서 동시접속처리수와 반응시간에 대한 내용을 함께 알 수 있다면 좀더 도움이 되겠지요. 동시접속자수에 따라 벤치마크 결과가 전혀 다르게 나올수 있기 때문이이죠. 

SQL Relay도 제공하는 기능이 속도도 있지만 확장성, 여러 디비에 분산 엑세스, 지원되지 않는 플랫폿에서의 db접근등이 있네요. 

시간여유가 있으면 좀더 자료를 뒤져보고 찾아보고싶지만 지금은 시간이 안되어. 

음. 쓰고나니 좀 두리뭉실한 글이 되어버렸네요. 

아 그리고 요즘엔 여기 글을 쓰지 않기는 하지만 예전에 가끔 글을 올린적이 있었지요. 오래되어서 기억이 잘 안나지만.
<textarea style="DISPLAY: none" id="save_comment_36347">php, mysql 관련된 사이트에서 커넥션 풀링과 관련된 자료를 찾아보아도 그다지 자료가 나오는게 없군요. 위에 토론을 보다보니 궁금해지기는 해서요.저야 자세한 내용까지는 모르겠지만 전영규님 말대로 정확한 근거와 수치를 제시하는것은 필요하다는 생각이 들어요. 저도 잘 못하는 것이기는 하지만 이렇게 이렇게 하는것이 더 좋지 않겠냐는 말은 막연한 것이 있지요. (그래도 아무런 말을 하지 않는것도바는 막연하게라도 표현하는게 더 낫긴한데...)전영규님이 다른 분들한테 계속 억지주장을 하는게 아니라 사람들이 커넥션 풀이 유용하다고 하는데 그에 대한 실증적인 내용과 분명한 근거를 알고 싶다는 의견같네요. 맞나요?좀 다른 이야기지만 이런 것도 있지요. 예를 들어 http 1.1 에서는 keepalive를 지원하며 웹서버에 접속한 경우 일정한 시간동안 연결을 유지시켜줍니다. 그런데 사이트에 접속자가 많으면 오히려 유휴프로세서를 많이 생기게하여 문제를 발생시키는 경우가 생깁니다. keepalive를 off로 하면 시스템상에서 프로세서를 더 자주 생성시키고 소멸시키기때문에 시스템의 부하는 전체적으로 높여지지만 오히려 웹성능자체는 향상될수가 있습니다. 지속적인 연결을 하는 것과 tiemout 값이 접속자가 많은 경우 상당히 많은 영향을 미치지요.DB에서 새로 DB프로세서를 생성하는것이 쿼리를 실행하는 것에 비하면 더 부하를 주는 것이지만 이것이 정말 심각할 정도로 영향을 주는 문제인가 이런 궁금함이 생기네요.커넥션 풀이 나름대로의 장점을 가지고 있다고 하더라도 정말 이것이 커넥션풀을 쓰지 않는 것에 비하여 엄청나게 많은 장점을 가지고 있는것인지 이런 의문은 충분히 가질수 있다는 생각이 듭니다.좀더 나아가면 어떤 경우에 커넥션풀을 쓰는게 더 적합한지 이런 것을 생각할 수 있을듯. 여러가지 경우에 따라 적합한 것이 다를 수 있으니깐요.하늘너굴님이 올린 자료는 좀더 실증적인 자료인데 예를 들어 벤치마킹을 한다면 동시사용자를 올리면서 동시접속처리수와 반응시간에 대한 내용을 함께 알 수 있다면 좀더 도움이 되겠지요. 동시접속자수에 따라 벤치마크 결과가 전혀 다르게 나올수 있기 때문이이죠.SQL Relay도 제공하는 기능이 속도도 있지만 확장성, 여러 디비에 분산 엑세스, 지원되지 않는 플랫폿에서의 db접근등이 있네요.시간여유가 있으면 좀더 자료를 뒤져보고 찾아보고싶지만 지금은 시간이 안되어.음. 쓰고나니 좀 두리뭉실한 글이 되어버렸네요.아 그리고 요즘엔 여기 글을 쓰지 않기는 하지만 예전에 가끔 글을 올린적이 있었지요. 오래되어서 기억이 잘 안나지만.</textarea>
학생 04-12-28 15:04 |삭제
오~ 비록 대부분이 알아들을수 없는 얘기지만, 읽는 사람(초보인입장)으로 하여금 정말 공부하고 싶게 만들어주는 토론이네요. 스쿨의 가장 큰 미덕이 아닐까 하네요. 긴 토론 하신분들 모두 감사합니다.
<textarea style="DISPLAY: none" id="save_comment_36348">오~ 비록 대부분이 알아들을수 없는 얘기지만, 읽는 사람(초보인입장)으로 하여금 정말 공부하고 싶게 만들어주는 토론이네요. 스쿨의 가장 큰 미덕이 아닐까 하네요. 긴 토론 하신분들 모두 감사합니다.</textarea>
전영규 04-12-28 16:20 |삭제
문태준님 좋은 정리글에 감사드립니다. 
프로그래밍이나 어느분야에서나... 
개인적으로 가장 경계하는 것은 비판없이 수용하는 것입니다. 
특히 우리같은 개발쪽 분야예선, 이건 거꾸로 우리 자신에게 커다란 억압이 됩니다. 
다행인 것은 적어도 개발쪽에서는, 실험을 통해 결과를 알 수가 있으니 분명한 결론을 얻기위해 노력이라도 할 수 있어 좋습니다.. (물론 이론적 추론도 가능하고.. ) 
이 문제에 대해 나중에라도 증명할 기회가 있으면 좋겠습니다. 
어느쪽의 말이 맞든지간에... 지금은 다들 추론 상태니까요. 

토론에 참여해주신 분들께 감사드립니다... 

-- jeon.
<textarea style="DISPLAY: none" id="save_comment_36349">문태준님 좋은 정리글에 감사드립니다.프로그래밍이나 어느분야에서나... 개인적으로 가장 경계하는 것은 비판없이 수용하는 것입니다.특히 우리같은 개발쪽 분야예선, 이건 거꾸로 우리 자신에게 커다란 억압이 됩니다.다행인 것은 적어도 개발쪽에서는, 실험을 통해 결과를 알 수가 있으니 분명한 결론을 얻기위해 노력이라도 할 수 있어 좋습니다.. (물론 이론적 추론도 가능하고.. )이 문제에 대해 나중에라도 증명할 기회가 있으면 좋겠습니다.어느쪽의 말이 맞든지간에... 지금은 다들 추론 상태니까요.토론에 참여해주신 분들께 감사드립니다... -- jeon.</textarea>
ㅇ_ㅇ 04-12-29 16:44 |삭제
mysql 및 기타 대형DB 들도 컨넥션에 드는 부하는 그리 크지 않다 <-- 이부분은 근거가 있는건가요? 
커넥션의 부하때문에 고심해본적이 있어서 여쭈어봅니다.
<textarea style="DISPLAY: none" id="save_comment_36350">mysql 및 기타 대형DB 들도 컨넥션에 드는 부하는 그리 크지 않다 <-- 이부분은 근거가 있는건가요?커넥션의 부하때문에 고심해본적이 있어서 여쭈어봅니다.</textarea>
전영규 04-12-30 00:17 |삭제
참고하세요... 몇번 테스트해본 결과입니다. 
컨넥션... 
mysql : 0.00042sec (한가한 개인서버) 
oracle : 0.04969sec (좀 비지한 운영서버) 

-- jeon.
<textarea style="DISPLAY: none" id="save_comment_36351">참고하세요... 몇번 테스트해본 결과입니다.컨넥션...mysql : 0.00042sec (한가한 개인서버)oracle : 0.04969sec (좀 비지한 운영서버)-- jeon.</textarea>
오해를 04-12-31 05:47 |삭제
/jeon 

추론 상태가 아니라, 이미 많은 자료들이 존재하는 내용이기에 더 이상 언급되지 않는 것 입니다. (또는 이전 글에서 말씀 드렸다시피 사내문서라 오픈을 할 수 없거나, 귀찮은 부분이 가장 크겠지요.) 

조금만 노력하신다면 관련 자료들은 읽어 보기도 벅찰 정도로 차고도 넘칩니다.  구태여 하나 집어 드리자면, javaservice.net에서 이원영씨의 글이나 직접 검색해 보셔도 많은 사례를 보실 수 있을겁니다. 

이러한 명확하고 충분히 스스로들 찾아볼 수 있는 내용에 대해서 증명을 운운한다는 것 자체가 이해하기 힘드네요. 

또한 단순히 마이크로타임을 찍어, 커넥션 시간을 측정하는 방식으로는 아무것도 알 수가 없습니다. (차라리 스트레스테스트툴을 구하셔서 조금씩 강도를 높여 가면서 측정하시는 것이 정확하실 겁니다.) 

토론에 발언권을 가진 발언자는 최소한의 참여 자격이 있습니다. 몇몇 잘못된 지식을 버젓이 언급한 후, 그 부분에 대한 지적은 유야무야 흐리고, 예의바른? 감정적 대응으로 넘어가는 것은 초급 개발자들에게는 잘못된 상식을 안겨주고, 중/고급 개발자에게는 씁쓸한 기분을 주어서 참여 자체를 막게 됩니다. 

이런 부분들이 참으로 아쉽네요. 

토론은 명확한 본인의 지식을 기반에 두고, 서로간에 배워가는 장 입니다. (최소한 본인이 아는것은 명확히 언급을 하고, 모르는 부분에 대해서는 겸허히 받아들여야 한다는 의미입니다.) 그 최소한의 지식의 기반없이는 아무런 진전없이 상투적인 대화들만 오가겠지요.
<textarea style="DISPLAY: none" id="save_comment_36352">/jeon추론 상태가 아니라, 이미 많은 자료들이 존재하는 내용이기에 더 이상 언급되지 않는 것 입니다. (또는 이전 글에서 말씀 드렸다시피 사내문서라 오픈을 할 수 없거나, 귀찮은 부분이 가장 크겠지요.)조금만 노력하신다면 관련 자료들은 읽어 보기도 벅찰 정도로 차고도 넘칩니다. 구태여 하나 집어 드리자면, javaservice.net에서 이원영씨의 글이나 직접 검색해 보셔도 많은 사례를 보실 수 있을겁니다. 이러한 명확하고 충분히 스스로들 찾아볼 수 있는 내용에 대해서 증명을 운운한다는 것 자체가 이해하기 힘드네요.또한 단순히 마이크로타임을 찍어, 커넥션 시간을 측정하는 방식으로는 아무것도 알 수가 없습니다. (차라리 스트레스테스트툴을 구하셔서 조금씩 강도를 높여 가면서 측정하시는 것이 정확하실 겁니다.)토론에 발언권을 가진 발언자는 최소한의 참여 자격이 있습니다. 몇몇 잘못된 지식을 버젓이 언급한 후, 그 부분에 대한 지적은 유야무야 흐리고, 예의바른? 감정적 대응으로 넘어가는 것은 초급 개발자들에게는 잘못된 상식을 안겨주고, 중/고급 개발자에게는 씁쓸한 기분을 주어서 참여 자체를 막게 됩니다.이런 부분들이 참으로 아쉽네요.토론은 명확한 본인의 지식을 기반에 두고, 서로간에 배워가는 장 입니다. (최소한 본인이 아는것은 명확히 언급을 하고, 모르는 부분에 대해서는 겸허히 받아들여야 한다는 의미입니다.) 그 최소한의 지식의 기반없이는 아무런 진전없이 상투적인 대화들만 오가겠지요.</textarea>
오해를 04-12-31 05:54 |삭제
다만 한가지, 비판없이 수용하는 것을 경계한다는 말에는 전적으로 동의를 합니다. 

다만, 그 부분 역시 서비스 지향 아키텍쳐니 모델 드리븐이니, method/1은 너무 낡지 않았는가, 로즈 보다는 투게더가 더 훌륭한 툴이지 않은가등과 같이 항상 구체적으로 답을 내리기 힘든 부분들에 어울리는 내용이라 생각됩니다. 

즉, 구체적인 지식과 명확한 결론이 있는 토론과, 개인의 깊은 사색이 필요한 토론은 애초에 분리되어 있다는 의미이기도 합니다.
<textarea style="DISPLAY: none" id="save_comment_36353">다만 한가지, 비판없이 수용하는 것을 경계한다는 말에는 전적으로 동의를 합니다.다만, 그 부분 역시 서비스 지향 아키텍쳐니 모델 드리븐이니, method/1은 너무 낡지 않았는가, 로즈 보다는 투게더가 더 훌륭한 툴이지 않은가등과 같이 항상 구체적으로 답을 내리기 힘든 부분들에 어울리는 내용이라 생각됩니다.즉, 구체적인 지식과 명확한 결론이 있는 토론과, 개인의 깊은 사색이 필요한 토론은 애초에 분리되어 있다는 의미이기도 합니다.</textarea>
전영규 04-12-31 11:38 |삭제
찾아봐도 구체적인 성능향상 수치는 없던데요.. ? 
자바쪽에선 컨넥션풀을 상당히 비중있게 생각하는 듯 한데, 좀 맹목적이군요. 왜 쓰는지에 대한 설명은 간략하고, \'사용법\'에 대한 설명은 90% 를 넘는 지면을 쓰고 있습니다. 

오해를님 
말씀은 잘 하시는데, 수치를 제공하고 증명해야할 사람은 바로 \'오해를\' 님이 아닌가 싶군요. 제가 찾는것보단 훨씬 양질의 자료를 이미 갖고 계시지 않습니까... 

계속 토론을 이어가고 싶다면 자료를 제시하면서 저에 대해 반박하는 것이 방법같군요. 백마디 말보다 한줄의 수치제시면 끝입니다. 
계속해서 인문사회학적 토론을 하기 싫으시다면요. 

-- jeon.
<textarea style="DISPLAY: none" id="save_comment_36354">찾아봐도 구체적인 성능향상 수치는 없던데요.. ?자바쪽에선 컨넥션풀을 상당히 비중있게 생각하는 듯 한데, 좀 맹목적이군요. 왜 쓰는지에 대한 설명은 간략하고, \'사용법\'에 대한 설명은 90% 를 넘는 지면을 쓰고 있습니다.오해를님말씀은 잘 하시는데, 수치를 제공하고 증명해야할 사람은 바로 \'오해를\' 님이 아닌가 싶군요. 제가 찾는것보단 훨씬 양질의 자료를 이미 갖고 계시지 않습니까... 계속 토론을 이어가고 싶다면 자료를 제시하면서 저에 대해 반박하는 것이 방법같군요. 백마디 말보다 한줄의 수치제시면 끝입니다. 계속해서 인문사회학적 토론을 하기 싫으시다면요.-- jeon.</textarea>
하늘너굴 05-01-02 02:44 |삭제
전제 : 저희 회사에서 풀링을 이용한 전제는 db서버의 성능 향상과 관계가 있고 웹서버의 부하를 줄이고자 하는 목적은 아니였습니다.  

참고로 현재 한개의 db 서버에 4개의 웹서버가 연동하고 있습니다. 



php4 와 오라클9i의 디스커넥션이 지원되는 않는 문제는 
운영하시는 분이 계시면 테스트 바랍니다.. 

저희의 테스트 결과는 disconnect() 함수에 의해서가 아닌 php프로세스 소멸과 함께 oracle의 커넥션이 끊기는것 같다는 것입니다. 

1. 저도 월요일 출근을 하게 되면 이 부분에 대한 테스트를 다시 해보도록 하겠습니다. 

2. 저번 올린 자료의 뒷받침 할 만한 자료(스트레스 테스트 자료)를 업로드 하도록 하겠습니다.
<textarea style="DISPLAY: none" id="save_comment_36355">전제 : 저희 회사에서 풀링을 이용한 전제는 db서버의 성능 향상과 관계가 있고 웹서버의 부하를 줄이고자 하는 목적은 아니였습니다. 참고로 현재 한개의 db 서버에 4개의 웹서버가 연동하고 있습니다.php4 와 오라클9i의 디스커넥션이 지원되는 않는 문제는운영하시는 분이 계시면 테스트 바랍니다..저희의 테스트 결과는 disconnect() 함수에 의해서가 아닌 php프로세스 소멸과 함께 oracle의 커넥션이 끊기는것 같다는 것입니다.1. 저도 월요일 출근을 하게 되면 이 부분에 대한 테스트를 다시 해보도록 하겠습니다.2. 저번 올린 자료의 뒷받침 할 만한 자료(스트레스 테스트 자료)를 업로드 하도록 하겠습니다.</textarea>
사랑과이해 05-01-06 09:01 |삭제
php4 + oracle8i(Enterprise with MTS) 으로 돌려봤었는데 
동시접속 100명이상 거뜬 합니다.(WebLog 1G/일 이상 사이트였습니다.) ^^; 
dedicate 로는 종종 DB가 죽는 상황이 있었는데 MTS로 돌린후에는 그런일이 없었지요. disconnect()도 잘 되었습니다. 
MTS쓰고 나서는 connection pooling을 굳이 찾을 필요가 없었습니다.
<textarea style="DISPLAY: none" id="save_comment_36356">php4 + oracle8i(Enterprise with MTS) 으로 돌려봤었는데동시접속 100명이상 거뜬 합니다.(WebLog 1G/일 이상 사이트였습니다.) ^^; dedicate 로는 종종 DB가 죽는 상황이 있었는데 MTS로 돌린후에는 그런일이 없었지요. disconnect()도 잘 되었습니다.MTS쓰고 나서는 connection pooling을 굳이 찾을 필요가 없었습니다.</textarea>
망게 05-01-07 18:20 |삭제
지나가다 우연히 글을 봤는데 서로 소모적인 논쟁을 하는 것 같네요. 

위에서 어떤 분이 언급하셨듯이 하나의 기술이 모든 상황에 절대적으로 적용되는 것은 아니라고 생각합니다. 만약 많은 사용자가 새로운 커넥션을 요청하는 일이 빈번하다면 커넥션 풀을 사용하고 사용자가 적다면 굳이 거추장스럽게 커넥션 풀 같은걸 사용할 필요는 없겠지요. 제가 보기엔 두 주장 다 일리가 있는데 서로 자신의 상황에 비추어서만 글들을 남기시는것 같습니다. 

커넥션 풀 기법이 무가치하지 않다는건 알고 계실테고, 만약 우리가 모든 일을 논하는데 있어 수치를 제시해야 한다면 의견 교환은 매우 더뎌질 수 밖에 없을 것입니다. 또한 CPU가 성능이 50% 개선되었는데 CPU만 갈면 시스템 성능이 50% 개선 되느냐 하면 그렇지 않고 실제 전체 성능 개선은 그보다 훨씬 못하다는 것은 다들 아실겁니다. 

저는 절대적인것은 없다라고 생각합니다. 모든 경우가 일반적이라면 왜 개발 툴은 이렇게 많으며 왜 DBMS는 이렇게 종류가 많을걸까요? 결국 그 상황에 맞게 선택하는게 중요한 것 같습니다.
<textarea style="DISPLAY: none" id="save_comment_36357">지나가다 우연히 글을 봤는데 서로 소모적인 논쟁을 하는 것 같네요.위에서 어떤 분이 언급하셨듯이 하나의 기술이 모든 상황에 절대적으로 적용되는 것은 아니라고 생각합니다. 만약 많은 사용자가 새로운 커넥션을 요청하는 일이 빈번하다면 커넥션 풀을 사용하고 사용자가 적다면 굳이 거추장스럽게 커넥션 풀 같은걸 사용할 필요는 없겠지요. 제가 보기엔 두 주장 다 일리가 있는데 서로 자신의 상황에 비추어서만 글들을 남기시는것 같습니다.커넥션 풀 기법이 무가치하지 않다는건 알고 계실테고, 만약 우리가 모든 일을 논하는데 있어 수치를 제시해야 한다면 의견 교환은 매우 더뎌질 수 밖에 없을 것입니다. 또한 CPU가 성능이 50% 개선되었는데 CPU만 갈면 시스템 성능이 50% 개선 되느냐 하면 그렇지 않고 실제 전체 성능 개선은 그보다 훨씬 못하다는 것은 다들 아실겁니다.저는 절대적인것은 없다라고 생각합니다. 모든 경우가 일반적이라면 왜 개발 툴은 이렇게 많으며 왜 DBMS는 이렇게 종류가 많을걸까요? 결국 그 상황에 맞게 선택하는게 중요한 것 같습니다.</textarea>
luna 05-03-02 16:33 |삭제
MySQL은 의외로 제가 써본 경험에 의하면 커넥션 클로즈가 제대로 안돼어서 죽는경우가 많습니다. 설정에서 시간 설정에 짧게 잡아도 어는 마진이 필요하기때문에 완전히 끈는데는 시간이 걸리는데요..그사이 계속 커넥션 요청이 들어오면 DB 다운 _ _;; 이런 경우가 생깁니다.  그리고 oracle에서 MTS와 DEDICATE연결은 커넥션 풀하고는 거리가 먼 문제인거 같은데요..분석툴로 한번 보시면 왜 데디케이트에서 죽는지 알아내실수 있을듯 하네여.
<textarea style="DISPLAY: none" id="save_comment_36358">MySQL은 의외로 제가 써본 경험에 의하면 커넥션 클로즈가 제대로 안돼어서 죽는경우가 많습니다. 설정에서 시간 설정에 짧게 잡아도 어는 마진이 필요하기때문에 완전히 끈는데는 시간이 걸리는데요..그사이 계속 커넥션 요청이 들어오면 DB 다운 _ _;; 이런 경우가 생깁니다. 그리고 oracle에서 MTS와 DEDICATE연결은 커넥션 풀하고는 거리가 먼 문제인거 같은데요..분석툴로 한번 보시면 왜 데디케이트에서 죽는지 알아내실수 있을듯 하네여.</textarea>
근데염 05-06-24 18:21 |삭제
망게님께 한표... 
이리저리 검색해봤는데 
전 nt기반에서 놀다보니 커넥션풀에 대해 무지했습니다. 
ms가 시키는대로만 했으니... ㅋㅋ 
찾아보니 ms는 이미 커넥션풀을 제공하더군요. 
그러나 오라클 경우는 프로그래머가 직접 작업해야 한다고 하네요. 이래나 저래나.. 
다들 부하걸리게시리 db에 의존하고 계시나요? html생성도 좀 하시고 클라이언트단의 변수에 데이타도 좀 넣어놓고 그러세요. 
그럼 커넥션풀을 쓸 일 별로 없을껍니다.
<textarea style="DISPLAY: none" id="save_comment_36359">망게님께 한표...이리저리 검색해봤는데전 nt기반에서 놀다보니 커넥션풀에 대해 무지했습니다.ms가 시키는대로만 했으니... ㅋㅋ찾아보니 ms는 이미 커넥션풀을 제공하더군요.그러나 오라클 경우는 프로그래머가 직접 작업해야 한다고 하네요. 이래나 저래나..다들 부하걸리게시리 db에 의존하고 계시나요? html생성도 좀 하시고 클라이언트단의 변수에 데이타도 좀 넣어놓고 그러세요.그럼 커넥션풀을 쓸 일 별로 없을껍니다.</textarea>
근데염 05-06-24 18:24 |삭제
참고로... 니가 뭘 아느냐 혹은 니글은 여기에 해당되는 글이 아니다 라면서 면서 태클 거실 분 있을텐데요.. 
관련있습니다. 목적은 부하 안걸리고 잘 돌리는거니깐요. 
참고 : phpschool 이나 야후코리아보다 더 부하 많이 걸리는 곳에서 전 일하고 있습니다.
<textarea style="DISPLAY: none" id="save_comment_36360">참고로... 니가 뭘 아느냐 혹은 니글은 여기에 해당되는 글이 아니다 라면서 면서 태클 거실 분 있을텐데요..관련있습니다. 목적은 부하 안걸리고 잘 돌리는거니깐요.참고 : phpschool 이나 야후코리아보다 더 부하 많이 걸리는 곳에서 전 일하고 있습니다.</textarea>
쇼크렛 06-03-10 16:03
저는 C프로그래머입니다. 주로 소켓과 네트워크 프로그래밍을 해왔는데, 
그전에 통신사 프로젝트할때, 일반적으로 하나의 프로세스 또는 하나의 쓰레드에서 
접속을 열고 패킷을 주고 받고, 접속을 끊는 방식으로 하니까 로드러너 툴로 300TPS정도 나오더군요. 
한데, 아파치 서버 소스를 참조해서 커넥션풀 방식으로 바꾸니까 1000TPS 정도 나오더군요. 
아파치 서버는 한 1500TPS 나오더라구여. PHP만 짜시지 마시고, 아파치 서버의 C소스를 보세여. 
그럼 커넥션풀이 얼마나 좋은건지 아실겁니다. ㅋ
<textarea style="DISPLAY: none" id="save_comment_45211">저는 C프로그래머입니다. 주로 소켓과 네트워크 프로그래밍을 해왔는데,그전에 통신사 프로젝트할때, 일반적으로 하나의 프로세스 또는 하나의 쓰레드에서접속을 열고 패킷을 주고 받고, 접속을 끊는 방식으로 하니까 로드러너 툴로 300TPS정도 나오더군요.한데, 아파치 서버 소스를 참조해서 커넥션풀 방식으로 바꾸니까 1000TPS 정도 나오더군요.아파치 서버는 한 1500TPS 나오더라구여. PHP만 짜시지 마시고, 아파치 서버의 C소스를 보세여.그럼 커넥션풀이 얼마나 좋은건지 아실겁니다. ㅋ</textarea>
한다면한다 09-07-20 08:49
TCP/IP 통신을 할 때 커넥션을 얻는 과정을 보면 몇단계에 걸쳐 이루어지게 됩니다. 결국 이 과정이 제일 시스템에 부담을 많이 주는 과정이 됩니다. 결국은 database connection 또한 실제로는 socket 연결이기 때문에(단순한 socket 연결보다 더 부하를 주겠죠. user account, grant 등등을 체크해야 하므로...) 클라이언트의 요청시 마다 connection을 생성하는 것 보다는 pool과 같은 형태로 처리하는 것이 많이 유리하다는 것이 개인적인 생각입니다.

 

 

 

 

출처 - http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=36317&sca=DBMS&page=8


반응형
반응형

vi editor iptables을 편집해줍니다.

 # vi /etc/sysconfig/iptables 



iptables에 아래 내용을 추가해주고 저장합니다.

 -A INPUT -m state --state NEW -m tcp -p tcp --dport 3690 -j ACCEPT  




그리고 iptables를 재시작해줍니다.

 # service iptables restart




iptables가 재시작이 잘 되었으면 3690포트를 통해서 외부에서 접속할 수 있게됩니다.



그래도 안된다면 걍 방화벽 전체 해제하고 설정에 추가하자

chkconfig iptables off


chkconfig iptables 345 on 이런식도 가능하다

반응형

'연구개발 > Linux' 카테고리의 다른 글

centos 6.x max process 값 튜닝 for mysql  (0) 2014.04.13
php의 커넥션풀( Connection Pool)  (0) 2014.04.13
YUM 설치시  (0) 2014.04.01
CentOS6 레드마인 최신 버전 설치기 (redmine)  (0) 2014.03.24
make 실행시 오류날 때  (0) 2014.03.23

+ Recent posts

반응형