2012년 9월 21일 금요일

Oracle Enterprise Manager 간략 사용기 2

http://tryinsights.blogspot.kr/2012/09/oracle-enterprise-manager-1.html 글에 이어 두번째.

Oracle Enterprise Manager로 AWR(Automatic Workload Repository), ASH(Active Session History) 리포트를 작성하는 방법.

AWR

Database Instance(데이터베이스 인스턴스)화면에서 Administration(관리) 탭을 선택.
Database Administration(데이터베이스 관리) -> Statistics Management(통계 관리) -> Automatic Workload Repository(자동 작업 로드 저장소)를 선택.

Manage Snapshots and Preserved Snapshot Sets(스냅샷 및 보관된 스냅샷 집합 관리) 항목에서 현재 EM이 보유하고 있는 Snapshot이 몇개 있는지 확인 할 수 있다.

Snapshot(스냅샷) 의 숫자를 클릭하면 Snapshot 화면이 나타난다.
Select Beginning Snapshot(시작 스냅샷 선택) 화면 에서 Action(작업)을 View Report(보고서 보기)로 선택하고 Beginning Snapshot 을 선택하고 Go(실행) 버튼을 누른다.
(Create(생성) 버튼이 아니다.)

View Report(보고서 보기) 화면 -> Select Ending Snapshot(종료 스냅샷 선택) 화면에서 Ending Snapshot 을 선택하고 OK(확인) 버튼을 누른다.
(Go(실행) 버튼이 아니다.)

잠시 후에 AWR Report 가 생성되고 Save to File(파일에 저장) 버튼으로 저장할 수 있다.


ASH

현재 데이터베이스 인스턴스 성능에 관련된 정보를 주기적으로 볼 수 있는 화면으로, 인스턴스 성능에 영향을 줄 수 있는 CPU 사용률, 활성화된 세션수, 디스크 입출력 등을 확인 할 수 있다.
Database Instance(데이터베이스 인스턴스) -> Performance(성능) 탭 선택.
Run ASH Report 버튼 클릭.

Run ASH Report 화면에서 Start Date, Start Time, End Date, End Time 을 선택 후 Generate Report 버튼 클릭

2012년 9월 20일 목요일

Oracle Enterprise Manager 간략 사용기 1

oracle 10g 버전에서 Oracle EM을 사용해봤다.

사용경험을 간단히 적어본다.

로그인을 하면 첫 화면에 굵직한 항목들이 보인다.

가장 자주보게 될 것 같은 화면은 "데이터베이스 인스턴스(Database Instance)" 화면에 있는 "성능(Performance)" 탭이다.

다음과 같은 그래프를 확인 할 수 있다.

Host 그래프 : 호스트의 CPU 평균부하
Average Active Sessions 그래프 : Active Session의 Wait 상태정보
Instance Disk I/O : Instance에서 사용중인 Disk I/O 상태
Instance Throughput : Instance Throughput 상태

Active Sessions 그래프에서 가장 많은 면적을 차지하는 CPU Used 항목을 선택하면 상세정보를 보여준다. 시간대 별로 Top SQL과 Top Session 정보를 확인할 수 있다.


Average Active Sessions 그래프를 보여주는 화면에서 ADDM을 사용할 수 있다.

Run ADDM Now 버튼을 누르고 다시 확인 버튼을 누르면 Average Active Sessions 그래프의 특정 시간대를 선택할 수 있는 화면이 나타난다. 특정 시간대를 선택하면 하단의 Performance Analysis 창에 성능문제 요소와 각 요소별 영향도와 권장 사항을 요약하여 보여준다.

Performance Analysis 창에서 영향(Impact)가 높은 항목을 선택하면 세부 정보 화면이 나타난다. 세부정보 화면에서는 권장사항을 확인 할 수 있다. "모든 세부 정보 표시(Show All Details)를 선택하고 그 중  이익률(Benefit)이 가장 높은 항목의 "지금 권고자 실행(Run Advisor Now)를 클릭한다. "SQL 튜닝 권고자 일정잡기(Schedule SQL Turning Advisor)"  버튼을 클릭하여 원하는 시점에 시작할 수 있게 설정할 수 있다.

일정시간이 지나면 Recommendations 화면이 나타난다.
이 화면에서 View Recommendations 버튼을 클릭하여 SQL 튜닝 결과를 확인한다. 튜닝 결과 새로운 실행계획과 Benefit이 %로 나타난다. 튜닝된 실행계획은 기존 실행계획과 비교할 수 있다.

해당 화면에서 Implement 버튼을 클릭하면 튜닝된 실행계획을 적용시킨다.

(실제로 Implement 버튼을 클릭해 튜닝된 실행계획을 적용시켜 보지는 못했다-_-;)

Solaris 가상메모리

Solaris는 가상메모리 시스템을 사용한다.

가상메모리 시스템이란 물리적 메모리와 하드디스크를 결합하여 하나의 큰 메모리 처럼 사용하는 것을 말한다.

물리적 메모리 + 스왑 디바이스 - VM management overhead = swap (VM)

(물리적 메모리 + 스왑 디바이스) * about 90% = swap(VM)

솔라리스는 가상메모리를 관리하기 위해 메모리를 페이지 단위(8k)로 나누어 관리한다.

(페이지 size는 pagesize로 확인한다.)

이러한 페이지를 모아서 세그먼트로 구성하여 사용한다. 프로세스가 동작하기 위해서는 그 프로세스가 필요한 메모리가 있다. 그러나 그 메모리가 물리적 메모리에 모두 적재되어야 실행되는 것은 아니다. 프로세스가 실제 엑세스하는 메모리만 물리적 메모리에 적재되어 있이도 프로세스는 실행된다. 구론대 여유있는 물리적 메모리가 없어서 프로세스에게 필요한 메모리를 줄 수 없을 때 커널은 현재 사용하고 있는 물리적 메모리 중에 최근에 사용되지 않은 메모리를 선택하여 그 메모리를 프로세스에게 준다.

Solaris에서는 가상메모리를 swap으로 부른다.(swap partition과 구별) 이 swap(VM)은 운영체제가 사용할 수 있는 메모리다. vmstat 명령어의 4번째 필드 swap은 사용가능한 가상메모리의 크리를 KB 단위로 나타내고 5번째 필드 free는 사용 가능한 물리적 메모리를 KB 단위로 나타낸다.

가상메모리에 대한 자세한 내용은 swap -s 명령어로 알 수 있다.


# swap -s
총: 7033864k 바이트 할당 + 868672k 예약 = 7902536k 사용, 21814816k 사용 가능

할당 받은 것과 예약된 것의 차이는 다음과 같다.

만일 프로세스가 데이터를 관리하기 위해 10MB의 메모리가 필요하여 요청했다면 10MB의 메모리가 그 프로세스가 사용할 수 있도록 예약해 둔다. 그리고 그 포로세스가 메모리를 실재 엑세스 할때 그 메모리가 할당된다. 예를 들어 10MB메모리를 요청하여 1MB의 메모리만 엑세스했다면, 1MB는 할당된 영역에 더해지고, 9MB는 예약된 영역에 더해진다.

응용 프로그램이 동작할때 필요한 메모리는 swap(VM)에서 가져온다. 물리적 메모리가 많든 적든 관계없이 swap 공간이 충분하면 프로그램이 실행되는데에 전혀 문제가 없다. 만일 물리적 메모리가 절대적으로 부족하다면, 실행속도가 늦어질 뿐, 메모리 부족으로 응용 프로그램이 중단되는 일은 없다.


swap partition에 대한 정보는 다음과 같이 swap -l 명령어로 확인 할 수 있다.

# swap -l
swapfile             dev  swaplo 블록   사용 가능
/dev/dsk/c0t0d0s1   32,9      16 33560432 33560432
총 swap partition은 약 16GB

블록은 전체 swap partition의 크기이며 512byte 단위다. free는 그 중 사용가능한 swap partition의 크기이면 역시 512byte 단위의 블록이다.


추가예정

사용가능한 가상메모리는 다음과 같이 확인 할 수 있다.


# swap -s
총: 7062496k 바이트 할당 + 886584k 예약 = 7949080k 사용, 21768576k 사용 가능

# vmstat 1 3
 kthr      memory            page            disk          faults      cpu
 r b w   swap  free  re  mf pi po fr de sr s1 s3 s9 sd   in   sy   cs us sy id
 0 0 0 22635688 8170192 1242 405 24166 0 0 0 0 2 54 -0 26 2151 9478 6393 7 9 83
 0 0 0 21777592 7594664 14 59 98 0 0  0  0  0  0  0  0  910 16713 2362 8  4 87
 0 0 0 21777464 7594672 13 35 16 0 0  0  0  0  0  0  0  790 5809 1648  2  2 95

# sar -r 1 3

SunOS newbluewin01 5.10 Generic_137111-01 sun4u    09/20/2012

15:22:49 freemem freeswap
15:22:50  949502 43555856
15:22:51  949500 43555856
15:22:52  950901 43555856

Average   949968 43555856


swap -s : 21768576k(약20G)
vmstat 1 3 : 21777464 
sar -r 1 3 : 43555856(block) * 512(byte) /1024 = 21777928

사용가능한 물리적 메모리는 vmstat의 free(KB)와 sar -r 의 freemem(page)에서 확인할 수 있다.

vmstat 1 3 : 7594672 (약 7G)
sar -r  1 3 : 949968 * 8192 = 7599744




ksar 사용법 정리

서버 성능 측정을 위해 sar를 열심히 찾아보다가 ksar 라는 것을 발견했다.

sar 데이터를 그래프로 나타내 주는 프로그램인데 사용법을 알아두면 유용할 것 같아 정리해 둔다.

일단 홈페이지는 여기.

http://sourceforge.net/projects/ksar/

다운 받아 압축을 풀어보면 몇개의 폴더와 파일이 나오는데 윈도우에서 실행하려면 그 중 kSar.jar 파일을 실행하면 된다.

ssh를 통해 서버에 접속하여 사용할 수도 있고 서버에서 데이터를 만들어 결과 파일을 import 할 수도 있다.

물론 서버에 직접 설치할 수도 있지만 운영서버에 그러고 싶지는 않아서-_-; 선택한 방법은 데이터 파일을 만들어 kSar 프로그램에 import.

아래 내용은 Solaris10 기준이다.

/usr/lib/sa/sa1 를 입력하면 /var/adm/sa 경로에 sa[dd] 파일이 생성된다.

[dd]는 해당 날짜를 의미한다.

sa[dd] 파일은 이진파일이어서 vi 등으로 데이터를 확인할 수 없다.

sar -A -f sa[dd] > output 커맨드를 이용해서 sa[dd]의 데이터를 text로 output 파일에 기록한다

생성된 output 파일을 ftp 등으로 kSar 프로그램이 설치된 PC로 옮기고 Data -> Load from text file 메뉴를 선택하여 output 파일을 import 한다.

/usr/lib/sa/sa1 커맨드를 한 번만 실행한 데이터를 output 파일로 만드니 output 파일에는 데이터가 포함되어있지 않은 것 처럼 보였다.

/usr/lib/sa/sa1 커맨드를 한 번 더 실행하고 output 파일을 생성하자 데이터가 보이기 시작했다.

원인은 정확히 모르겠지만 일단 무시하고...

/usr/lib/sa/sa1 커맨드를 여러번 실행하면 실행 한 횟수만큼의 데이터가 sa[dd] 파일에 누적됨을 확인했다.

cron을 이용하여 /usr/lib/sa/sa1 을 5분마다 실행되도록 설정했다.

0,5,10,15,20,25,30,35,40,45,50,55 * 20 9 * /usr/lib/sa/sa1

일단 테스트를위해 9월 20일에만 동작하도록 설정.

생성된 데이터를 kSar에서 확인해보니 그래프가 잘 나온다.

그래프의 의미를 해석하기 위해서는 계속 sar에 대해 공부가 필요할 듯 하다.

몇 일 테스트 해보고 이상이 없으면 output 파일을 만들고 ftp로 local로 전송하는 script와 sa[dd] 파일도 누적되어 디스크가 full 이 되지않도록 주기적으로 삭제하는 script를 만들어야겠다.


2012년 9월 19일 수요일

vmstat 분석(계속)

kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr s1 s3 s9 sd in sy cs us sy id
0 0 0 22638296 8172808 1241 405 24149 0 0 0 0 2 53 0 26 2152 9484 6396 7 9 83
0 0 0 21628528 7539648 1627 339 97720 0 0 0 0 0 0 0 67 2661 2880 5891 2 16 82
0 1 0 21621808 7517128 1498 1111 86065 0 0 0 0 0 0 0 53 2402 4554 5399 4 22 75
0 0 0 21609336 7517464 1580 2496 48768 0 0 0 0 1 0 0 36 1712 13020 5071 5 21 73
0 0 0 21613832 7526624 1418 1474 45617 0 0 0 0 197 0 0 41 1834 11530 4156 7 26 67
0 1 0 21623768 7516480 4286 678 84617 0 0 0 0 0 0 0 101 3348 11121 6880 18 18 64
0 1 0 21612096 7486936 2695 740 62159 0 0 0 0 0 0 0 54 2080 5215 4141 26 12 62
0 1 0 21628088 7453264 2887 346 66606 8 8 0 0 0 0 0 42 2104 3405 4069 34 10 56
0 2 0 21629944 7418056 2479 1 65777 0 0 0 0 0 0 0 38 2096 8782 3927 8 9 83
0 3 0 21618144 7330424 7991 404 148917 0 0 0 0 0 0 0 121 4524 7762 10128 5 27 68

한 화면에 나타내기 정말 어렵다-_- 잘(?) 보자.

서버 성능 측정을 위해 vmstat 을 찾아보았다.

vmstat 은 CPU와 I/O를 모니터링 할 수 있다.

첫 줄은 부팅 이후 각 통계치에 대한 평균값이다.

kthr - kernel thread state change

proc로 표현되기도 한다.

대부분의 OS는 멀티스레드 기능을 제공하며, 커널의 스케줄링도 스레드 단위로 한다.

멀티스레딩 방식으로 프로그래밍 되지 않은 프로세스는 하나의 프로세스에 하나의 스레드만 있다.

thread state는 3가지가 있다.

1. CPU를 사용하고 있는 스레드.
2. CPU를 사용하기 위해 Run Queue에서 대기하고 있는 스레드
3. I/O나 이벤트가 완료되기를 기다리면 sleep 중인 스레드

vmstat kthr의 r, b,w 의 의미는 다음과 같다.

r - the number of threads in run queue
CPU를 사용하기 위해 Run Queue에서 대기하고 있는 스레드(2 이상이면 CPU busy)

b - the number of threads blocked for resources (I/O, paging, and so forth)
I/O나 이벤트가 완료되기를 기다리며 sleep 중인 스레드
CPU 성능과 관계없다고 판단.
Disk의 I/O가 느릴때 b의 수치가 증가한다.

w - the number of threads swapped out
swap out된 실행가능한 스레드(0 이상이면 메모리가 부족하다고 판단)
시스템의 메모리가 부족할 때 paging이 발생.
페이징으로도 부족한 메모리를 보충하지 못하면 swapping이 발생.
이때 메모리로 부터 빠져나가 swap 디바이스에 보관된 스레드의 개수를 w에 보여준다.
swap out 된 스레드는 대기 후 다시 실행될 때 메모리로 swap in 된다.

memory - Report on usage of virtual and real memory.


swap - amount of swap space currently available (Kbytes)
사용 가능한 가상 메모리(physical memory + swap device)의 크기.
평소에 이 값이 높다고 해도 free 메모리의 여유가 있다면 메모리가 부족한 것이 아니다.

free - size of the free list (Kbytes)
사용 가능한 physical memory 의 크기.


page - Report information  about  page  faults  and paging  activity. (second.)

이후의 부분은 다음에 다시 정리하자.

Server의 Memory 성능의 지표를 알고 싶었는데 부족한 느낌이다.


참고사이트
http://ldcc.tistory.com/entry/vmstat-%ED%95%84%EB%93%9C-%EC%84%A4%EB%AA%85

http://blog.naver.com/PostView.nhn?blogId=ares2011&logNo=50023242845&parentCategoryNo=28&viewDate=&currentPage=1&listtype=0

http://jikime.tistory.com/286

C# 프로그램 구상

C#을 이용한 간단한 FrameWork를 구상하고 있다.

기본기능은 로그인, 자동업데이트, 로그처리 등이다.

로그인 되면 DB에서 계정 정보를 확인하고 해당 계정에 허용된 메뉴를 보여준다.

그리고 허용된 메뉴에 대하여 자동 업데이트를 진행한다.

고민이 되는 부분

Frame 안에서 실행되는 각 화면 중 하나가 실행 중 다운되면 Frame 자체에 영향을 주어 프로그램 전체가 다운되는 현상이 발생할 것 같다.

한 Frame에서 여러 화면이 독립적으로 운영되도록 하고 싶은데 방법이 있을까?

로그인, 자동 업데이트 부분은 구글링을 하면 많은 자료가 나온다.

하나씩 구현해보자.

로그에 포함되어야 할 부분은 다음과 같다.

1. 화면 호출
2. DB와 관련된 UI 조작
3. 호출된 query
4. 호출된 query의 실행 시간
5. fatch 수행 시간
6. 모든 로그는 시각과 USER_ID 포함

로그파일은 프로그램이 종료될때 서버로 전송된다.

서버에 전송된 파일은 로그 파싱 프로그램을 통해 DB 로 저장된다.

로그들을 수집하여 분석하면 다음과 같은 결과를 얻을 수 있다.

1. 비효율적으로 동작하는 query
2. 사용자 조작 오류 - 제작 의도와 다르게 사용하는 것도 오류라고 판단한다.
3. 프로그램 동작 시간
4. 특정 시간에 동작하는 query
5. 긴 기간동안 query 수행시간의 변화 추이

넘어야할 산이 많다. 차근차근 진행해보자.

C# 기초강좌 1

네임스페이스에는 다섯가지 엔티티(entity)들이 계층적으로 정리되어 있다.

1. class
코드와 데이터를 캡슐화하는 기본적인 구성 요소

2. struct
.NET 구조체는 참조 타입이 아닌 값 타입.
클래스와 유사.
힙이 아닌 스택에 저장되면 작은 행목들을 저장하거나 배열에 자장되는 경우에 적합.
상속될 수 없다.

3. interface
클래스와 유사.
메서드를 갖지만 메서드 내에 정의된 코드는 없다.
클래스는 여러 개의 인터페이스를 상속받을 수 있다.
캐스팅에 유용.

4. delegate
대리자는 메서드 프로토 타입.

5. enum
상수값을 정의.

2012년 9월 14일 금요일

DB Server 자원을 많이 사용하는 프로세스 찾기(ps)

ps를 이용하여 DB 서버 자원을 많이 사용하는 프로세스를 찾기위해 다음과 같이 처리했다.

ps -ef -o user,pid,ppid,pcpu,vsz,etime,time,args | sort -r -k 4 | head -n 15

부연 설명을 하자면

ppid
Parent Process ID

pcpu
간단히 말해서 CPU 사용률

vsz
프로세스가 사용하고 있는 가상 메모리의 크기(KB)

etime
프로세스가 시작한 후 경과된 시간

time
CPU 사용시간


args
command

sort -r -k 4

-r
reverse

-k
keydef

참고
http://docs.oracle.com/cd/E23823_01/html/816-5165/ps-1.html#REFMAN1ps-1

PID, SID를 이용하여 oracle query 확인


DB Server의 Resource를 과도하게 사용하는 프로세스를 확인할 때 사용한다.

PID를 알고 있을 경우

SELECT S.USERNAME USERNAME, S.OSUSER, S.PROGRAM, T.SQL_TEXT SQL, T.PIECE
FROM V$SQLTEXT T, V$SESSION S,
  (SELECT S.USERNAME USERNAME, S.OSUSER OSUSER, S.PROGRAM PROGRAM
  FROM V$SESSION S, V$PROCESS P
  WHERE P.ADDR = S.PADDR
  AND   S.SID IN (
    SELECT S.SID
    FROM V$SESSION S,V$PROCESS P
    WHERE P.ADDR=S.PADDR AND P.SPID = 6166)
  ) U
WHERE T.ADDRESS = S.SQL_ADDRESS
AND   S.USERNAME = U.USERNAME
AND   S.OSUSER  = U.OSUSER
AND   S.PROGRAM = U.PROGRAM
ORDER BY PIECE
;


SELECT SQL_TEXT
FROM V$SQLAREA
WHERE HASH_VALUE = (
  SELECT S.SQL_HASH_VALUE
  FROM V$SESSION S, V$PROCESS P
  WHERE P.ADDR=S.PADDR AND P.SPID=6166
  );

SID를 알고 있을 경우


SELECT /*+ RULE ORDERED */
S.SID,
S.SERIAL#,
S.SQL_HASH_VALUE,
Q.SQL_TEXT
FROM V$SESSION S,
V$SQLTEXT Q
WHERE S.SQL_HASH_VALUE = Q.HASH_VALUE
AND S.SQL_ADDRESS = Q.ADDRESS
AND S.SID = 948
AND S.SQL_HASH_VALUE <> 0
ORDER BY S.SID, Q.PIECE
;

process 확인은 다음의 명령어를 사용했다.
ps -ef -o user,pid,ppid,pcpu,vsz,pmem,nlwp,etime,time,args | sort -r -k 4 | head -n 15



Oracle 관련 OS 튜닝 방법

조규형님의 마소 2002년 3월 기고글을 요약했다.

DB 성능 측정에 도움이 될 듯하다...?

솔직히 장담은 못하겠다 ㅠㅠ

데이터베이스 성능에 문제가 발생한 경우 해결방법
1. 시스템의 사양을 높이는 방법
2. 튜닝

성능 관리의 단계
1. 분석단계
2. 설계단계
3. 개발단계
4. 테스트와 운영단계

1. 분석단계
업무 프로세스의 최적화, 시스템 구조 설정, 용량 산정
대략적인 경험치를 이용해 산정

2. 설계단계
논리적 설계, 데이터의 물리적 설계
논리 설계시에 도출된 ERD를 기초로 구축하고자 하는 시스템의 구조와 성능을 고려해 물리적 설계를 해야함.
요구 응답시간, 분산 데이터베이스 환경, 동시 사용자의 수, 데이터의 크기, 병렬 프로세싱 등을 고려.

3. 개발단계
SQL을 효율적으로 작성
옵티마이저의 이해
인덱스 정책

4. 테스트, 운영단계
OS튜닝
네트워크 튜닝
데이터베이스 튜닝
애플리케이션 튜닝

----

개발, 테스트, 운영 단계에서 고려해야 하는 오라클과 연동한 OS, 네트워크 튜닝에 대해 알아보자.

OS튜닝
OS에는 CPU, 메모리, 디스크I/O가 대표적 튜닝 대상.
통상적으로 OS튜닝은 전체 성능의 10% 이상의 성능 향상을 기대하기 힘들다.
다른 부분의 튜닝을 끝내고도 만족할만한 성과가 나타나지 않을 때 자세한 OS 튜닝으로 좋은 효과가 나타나는 경우가 있다.

CPU튜닝
유닉스의 sar 명령을 이용해 CPU의 사용량을 볼 수 있다.



# date; sar 3 10
2012년 9월 14일 금요일 오후 01시 41분 55초

SunOS 5.10 Generic_137111-01 sun4u    09/14/2012

13:41:55    %usr    %sys    %wio   %idle
13:41:58       3       7       0      90
13:42:01       3       2       0      95
13:42:04       8       9       0      83
13:42:07      47      19       0      33
13:42:10      20      18       0      62
13:42:13      15      14       0      70
13:42:16      12       8       0      80
13:42:19       6       6       0      89
13:42:22       4       4       0      92
13:42:25       4       3       0      93

Average       12       9       0      79



CPU는 정상적인 운영 상태에서 권장하는 사용 정도는 70~80%.
시스템의 사용량이 많은 시점을 고려하여 20~30%의 idle time이 유지되어야 함.
idle이 0%라는 의미는 CPU를 100% 사용한다고 볼 수도 있겠지만, 100% 이상을 사용해 CPU의 병목현상이 발생한다고 판단.
CPU가 부족하다고 판단된 경우에는 문제시되는 부분을 찾아 해결하거나 CPU 증설을 고려.
CPU의 사용량이 과다하게 나타났을 경우라면 우선 %usr, %sys, %wio의 비율을 비교.
데이터베이스를 사용하는 애플리케이션이 운영되는 시스템일 경우에는 %usr > %sys > %wio의 순으로 나타나는 것이 정상적.

%wio의 수치가 가장 높게 나타날 경우에는 CPU의 사용이 I/O waiting을 위해 사용된다고 추정가능함.
I/O의 병목현상을 해소시켜 주거나 유닉스 파일 시스템의 오퍼레이팅 버퍼 캐시의 활용도를 높여주면 전체적인 CPU 사용량은 감소하게 됨.
버퍼 캐시의 활용도를 높여주는 것보다는, I/O를 분산시키는 것이 훨씬 효과적임.

%sys의 사용량이 높을 경우에는 정상적이지 않은 프로세스가 CPU를 많이 점유하는 경우. 이런 경우 현재 시스템에서 CPU를 많이 사용하는 프로세스를 찾아 원인을 분석.
(현재 Solaris에서는 top이 없어서 prstat으로 확인가능하다.)
프로세스 분석에서 주의 깊게 봐야하는 것은 %CPU, %MEM, TIME.
각각 CPU 점유율, 메모리 점유율, 자동 후 CPU의 누적된 사용치.
하나의 프로세스가 CPU 하나를 99%나 100%를 차지하고 오랜 시간(1분 이상) 사용할 경우 이프로세스가 어떤 프로세스인지, 그리고 어떤 작업을 하는지 파악해야 함.

메모리 튜닝
유닉스 시스템은 Physical 메모리의 한계를 극복하기 위해 버추얼 메모리 개념을 사용해 메모리를 운영하는데, 버추얼 메모리의 크기는 'Physical 메모리 + 버추얼 메모리(Swap disk)'다. 버추얼 메모리는 page의 집합으로 구성되며, page의 크기는 보통 4KB 또는 8KB이다. Page란 메모리는 나누는 단위인데, 가능한 한 많은 Free 메모리를 유지하기 위해 현재 사용하고 있지 않은 page를 disk로 저장한다(page-out). 만약 현재의 어떤 프로세스가 physical 메모리에 존재하지 않은 page를 요청하면(page fault) disk에 저장한 page를 메모리로 읽어 들인다(page-in).
Swapping은 간단히 설명하자면 paging보다는 좀 더 큰 단위의 작업이다. paging이 page 단위의 관리를 한다고 하면, swapping은 프로세스가 사용하는 모든 page를 관리한다. 그러므로 다시 그 프로세스가 돌아가기 위해서는 관련된 모든 page가 메모리로 읽혀져야 하ㄴ므로 성능에 막대한 지장이 있다.
시스템이 정상적으로 운영되기 위해서는 Swapping은 절대 발생하지 않아야 하며, Paging도 되도록 겹쳐 발생하지 않도록 해야 한다. 그러므로 메모리를 모니터링할 때는 주로 paging과 swapping의 유무와 양을 중점적으로 분석한다. Paging과 Swapping의 내역을 보려면 다음과 같은 명령을 사용하면 된다.

paging

# sar -p 3 5

SunOS 5.10 Generic_137111-01 sun4u    09/14/2012

14:43:48  atch/s  pgin/s ppgin/s  pflt/s  vflt/s slock/s
14:43:51   20.07    2.96    2.96    1.32   37.50    0.00
14:43:54   89.11    5.28    5.28  211.22  511.22    0.00
14:43:57  119.02    5.25   26.23  242.30 1349.84    0.00
14:44:00  142.76    7.24   29.28  302.96  705.92    0.00
14:44:03  284.21   17.11   85.86  767.76 1428.95    0.00

Average   131.05    7.57   29.93  305.13  807.24    0.00

swapping
# sar -w 3 5

SunOS 5.10 Generic_137111-01 sun4u    09/14/2012

14:44:06 swpin/s bswin/s swpot/s bswot/s pswch/s
14:44:09    0.00     0.0    0.00     0.0    5491
14:44:12    0.00     0.0    0.00     0.0    4849
14:44:15    0.00     0.0    0.00     0.0    2001
14:44:18    0.00     0.0    0.00     0.0    3976
14:44:21    0.00     0.0    0.00     0.0    2094

Average     0.00     0.0    0.00     0.0    3682

시스템 내에 paging, swapping이 많이 발생하면 시스템의 성능을 보장할 수 없다. 현재 사용 가능한 Physical 메모리 내에 대부분의 사용 메모리가 들어갈 수 있도록 시스템을 재구성해야 한다.
현재 1GB의 메모리가 있다고 가정할 때, 유닉스 커널이 사용하는 메모리, 오라클 데이터베이스의 SGA영역, 개별 프로세스가 점유하는 메모리의 합이 일반적으로 고려되는 메모리의 양이다. 오라클의 SGA영역은 OS의 전체 메모리 중 40~60%를 사용하도록 지정한다.
만약 OS에 Swapping, Paging이 많이 발생해 메모리가 부족하다고 판단될 경우에는 메모리의 사용량을 줄여 Swapping, Paging을 없애야 한다. 따라서 초기 설정값을 지정하고 메모리의 사용량∙Swapping∙Paging의 양을 보고 SGA를 좀더 늘리거나 줄이면서 최적화된 메모리 사용량 구조를 도출하면 된다.

I/O 튜닝

... 시간관계상 다음 기회에...

2012년 9월 13일 목요일

C#에서 FarPointSpread CheckBox 사용


FarPointSpread에서 CheckBox를 사용하기위해 아래와 같이 선언한다.

FarPoint.Win.Spread.CellType.CheckBoxCellType checkBoxCellType6 = new FarPoint.Win.Spread.CellType.CheckBoxCellType();

선언한 후 cell에 적용은 아래와 같이.
this.fpSpread1_Sheet1.Columns.Get(8).CellType = checkBoxCellType6;

 Spread의 각 Row의 CheckBox 상태를 확인하기 위해서 다음과 같이 처리했다.
if (_ActiveSheet.GetValue(i, COL_MSG_SEND_YN) != null && bool.Parse(_ActiveSheet.GetValue(i, COL_MSG_SEND_YN).ToString()))
CheckBox가 체크되었다면 true, 체크 되지 않았다면 false가 된다.

FarPointSpread ClearRange

Spread에 출력되어 있는 모든 데이터를 초기화 하기 위해 다음과 같이 처리했다.


private void btnInit_Click(object sender, EventArgs e)
{
    _ActiveSheet.ClearRange(0, 0, _ActiveSheet.Rows.Count, _ActiveSheet.Columns.Count, true);
    _ActiveSheet.Rows.Count = 0;
}
 ClearRange는 다음과 같이 정의되어 있다.


 //
// 요약:
 //     Removes all of the data, formatting, formulas, and notes from a range of
//     cells on this sheet.
//
// 매개 변수:
//   row:
//     Row index of first cell in range
//
//   column:
//     Column index of first cell in range
//
//   rowCount:
//     Number of rows in range
//
//   columnCount:
//     Number of columns in range
//
//   dataOnly:
//     Whether to remove only data
public void ClearRange(int row, int column, int rowCount, int columnCount, bool dataOnly);

 _ActiveSheet.Rows.Count = 0; 처리를 하지 않으면 데이터는 초기화 되지만 빈 Spread가 그대로 남아있다.



C#에서 버튼(button) 호출

제목이 좀 이상한듯한데-_-; UI에서 버튼을 눌러 호출되는 함수를 그냥 code 상에서 호출할 때 다음과 같이 처리했다.


private void btnInit_Click(object sender, EventArgs e)
{
    _ActiveSheet.ClearRange(0, 0, _ActiveSheet.Rows.Count, _ActiveSheet.Columns.Count, true);
    _ActiveSheet.Rows.Count = 0;
}

위와 같은 함수를 호출하려면

btnInit_Click(null, null); 

요렇게 한다.

너무 기초적인건가;

C#과 FarPointSpread를 이용하여 "HH:mm" 형식으로 시간출력

Spread 상에는 "HH:mm" 형식으로 출력되고 DB에는 char(4) - HHmm 형식으로 저장시키기 위해 다음과 같이 처리했다.


private DateTime SetCheckTime(string time)
{
    int hour = int.Parse(time.Substring(0, 2));
    int minute = int.Parse(time.Substring(2, 2));
    DateTime retv = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, hour, minute, 0);
    return retv;
}

time은 "1234", "1212" 같은 문자열 이다.

Substring 을 이용하여 시와 분을 분리하고 int.Parse를 이용하여 각각 hour, minute 변수에 데이터를 넣는다.

그리고 DateTime 형식의 변수에 저장한다.



FarPointSpread에서는 다음과 같은 구현된다.

FarPoint.Win.Spread.CellType.DateTimeCellType dateTimeCellType6 = new FarPoint.Win.Spread.CellType.DateTimeCellType();
...

dateTimeCellType6.CalendarSurroundingDaysColor = System.Drawing.SystemColors.GrayText;
dateTimeCellType6.DateDefault = new System.DateTime(2012, 8, 30, 21, 58, 41, 0);
dateTimeCellType6.DateTimeFormat = FarPoint.Win.Spread.CellType.DateTimeFormat.UserDefined;
dateTimeCellType6.MaximumTime = System.TimeSpan.Parse("23:59:59.9999999");
dateTimeCellType6.TimeDefault = new System.DateTime(2012, 8, 30, 21, 58, 41, 0);
dateTimeCellType6.UserDefinedFormat = "HH:mm";
this.fpSpread1_Sheet1.Columns.Get(9).CellType = dateTimeCellType6;

CalendarSurroundingDaysColor, DateDefault  는 왜 포함되는지 잘 모르겠다;

나머지 코드는 차근차근보면 어떤 의미인지 알 듯하다.

이런식으로 처리해 놓고 해당 cell에 DateTime을 입력하면 "12:34", "12:12" 형식으로 출력된다.



Spread 상에 출력되어 있는 시간을 문자열로 받아들이기 위해 다음과 같이 처리했다.

data._checkTime = (((DateTime)_ActiveSheet.GetValue(i, COL_CHK_TIME)).Hour).ToString().PadLeft(2, '0') + (((DateTime)_ActiveSheet.GetValue(i, COL_CHK_TIME)).Minute).ToString().PadLeft(2, '0');

시간과 분을 나누어서 string으로 만들고 두 string을 붙인다.

각 string은 PadLeft 함수를 사용하여 "03", "05" 형식으로 만든다.



C#에서 Hashtable 사용

C#에 IBatis를 이용하여 프로그램을 개발 중이다.

query에 binding 처리를 하기 위해 parameterClass를 HashTable 형식으로xml에 매개변수를 전달한다.



private Hashtable ToParameter(ProcessCheckMaster obj)
{
    Hashtable param = new Hashtable();
    param.Add("CHK_ID", obj._checkID);
    param.Add("CHK_DIV", obj._checkDiv);
    param.Add("CHK_DETAIL_ID", obj._checkDetailID);
    param.Add("CHK_FILE_NO", obj._checkFileNo);
    param.Add("FILE_SEND_DIV", obj._fileSendDiv);
    param.Add("MESSAGE_SEND_YN", obj._msgSendYN);
    param.Add("CHK_TIME", obj._checkTime);
    param.Add("DATA_CNT", obj._dataCount);
    return param;
}

위의 함수는 Hashtable 형식으로 parameter를 만들기위해 사용한다.

2012년 9월 12일 수요일

C#에서 Panel 사용

여러개의 화면(Form)에서 공통의 사용자정의컨트롤을 사용할 경우 Panel을 이용하여 사용자정의컨트롤을 재사용할 수 있다.


private void frmSendFile_Load(object sender, EventArgs e)
{
    panel1.Controls.Clear();
    panel1.Controls.Add(new ctrlCheckUser());
}

위와 같이 사용하면  panel에 사용자정의컨트롤인 ctrlCheckUser이 출력된다.

C#에서 IList와 List

요즘 C#과 IBatis를 이용하여 프로그램을 개발하고 있다.

IBatis 사용이 익숙하지 않아 삽질의 연속이다.


public static IList<Hashtable> SelectQuery(string queryname, Hashtable parameter)
{
    string msg = string.Format(SELECT_QUERY, queryname);
    DataLog.WriteLog(_Logger, msg, parameter);
    return Mapper.Instance().QueryForList<Hashtable>(queryname, parameter);
}
위와 같이 SelectQuery() 함수를 만들어 이용하고 있는데, IBatis의 QueryForList() 함수는 IList<T>로 return한다.

IBatis의 QueryForList() 함수는 다음과 같이 정의되어 있다.
IList<T> QueryForList<T>(string statementName, object parameterObject);

아무든 IList<Hashtable>로 리턴 받은 값은 다음과 같이 사용할 수 있다.

private void btnSearch_Click(object sender, EventArgs e)
{
  IList<Hashtable> result = DBQuery.SelectQuery(SQL.SELECT_SEND_FILE_PROCESS_CHK_MASTER, GetSearchCondi());
  PrintSpreadProcessChkMaster(result);

private void PrintSpreadProcessChkMaster(IList<Hashtable> result)
{
    DefaultSheetDataModel model = new DefaultSheetDataModel();
    model.RowCount = result.Count;
    model.ColumnCount = COL_MAX;
 
    for (int i = 0; i < result.Count; i++)
    {
        model.SetValue(i, COL_ORG_ID, result[i]["HOLD_ORG_ID"].ToString());
        model.SetValue(i, COL_ORG_NAME, result[i]["HOLD_ORG_NAME"].ToString());
        model.SetValue(i, COL_FOLDER, result[i]["FOLDER"].ToString());
        model.SetValue(i, COL_FILE_NO, result[i]["FILE_NO"].ToString());
        model.SetValue(i, COL_FILE_NAME, result[i]["FILE_NM_FORMAT"].ToString());
        model.SetValue(i, COL_MAKE_PG, result[i]["MAKE_PG"].ToString());
        model.SetValue(i, COL_TRANS_TYPE, ConvertTransTypeToString(result[i]["TRANS_TYPE"].ToString()));
        model.SetValue(i, COL_MSG_SEND_YN, result[i]["MESSAGE_SEND_YN"].ToString() == "1" ? true : false);
        model.SetValue(i, COL_CHK_TIME, SetCheckTime(result[i]["CHK_TIME"].ToString()));
        model.SetValue(i, COL_CHK_ID, result[i]["CHK_ID"].ToString());
    }
    _ActiveSheet.Models.Data = model;
query에서 넘겨받은 값을 result[i]["HOLD_ORG_ID"].ToString() 과 같이 사용한다.



List<T>는 IList<T>와 조금 다르게 사용한다.


private void AddSendFileList(List<SendFile> list)
{
    DefaultSheetDataModel model = new DefaultSheetDataModel();
    model.RowCount = list.Count;
    model.ColumnCount = COL_MAX;
    for (int i = 0; i < list.Count; i++)
    {
        model.SetValue(i, COL_STATUS, "추가");
        model.SetValue(i, COL_ORG_ID, list[i]._holdOrgID);
        model.SetValue(i, COL_ORG_NAME, list[i]._holdOrgName);
        model.SetValue(i, COL_FOLDER, list[i]._folder);
        model.SetValue(i, COL_FILE_NO, list[i]._fileNo);
        model.SetValue(i, COL_FILE_NAME, list[i]._fileNameFormat);
        model.SetValue(i, COL_MAKE_PG, list[i]._makePG);
        model.SetValue(i, COL_TRANS_TYPE, ConvertTransTypeToString(list[i]._transType));
    }
    _ActiveSheet.Models.Data = model;
}

Hashtable도 참 생소하구나-_-;


C#에서 FarPoint Spread 출력

C#에서 FarPoint Spread 출력은 일단 두가지 방식이 있다.

일단 두가지 방식을 보자.

첫번째 방식이다.


int cnt = list.Count;
for (int i = _ActiveSheet.Rows.Count, j = 0; j < cnt; i++, j++)
{
    _ActiveSheet.AddRows(_ActiveSheet.Rows.Count, 1);
    _ActiveSheet.SetValue(i, COL_STATUS, "추가");
    _ActiveSheet.SetValue(i, COL_ORG_ID, list[j]._holdOrgID);
    _ActiveSheet.SetValue(i, COL_ORG_NAME, list[j]._holdOrgName);
    _ActiveSheet.SetValue(i, COL_FOLDER, list[j]._folder);
    _ActiveSheet.SetValue(i, COL_FILE_NO, list[j]._fileNo);
    _ActiveSheet.SetValue(i, COL_FILE_NAME, list[j]._fileNameFormat);
    _ActiveSheet.SetValue(i, COL_MAKE_PG, list[j]._makePG);
    _ActiveSheet.SetValue(i, COL_TRANS_TYPE, ConvertTransTypeToString(list[j]._transType));
}
AddRows를 사용하여 _ActiveSheet에 Row를 추가하고 각 Column에 직접 값을 기록한다.

이제 두번째 방식을 보자.


DefaultSheetDataModel model = new DefaultSheetDataModel();
model.RowCount = list.Count;
model.ColumnCount = COL_MAX;
for (int i = 0; i < list.Count; i++)
{
    model.SetValue(i, COL_STATUS, "추가");
    model.SetValue(i, COL_ORG_ID, list[i]._holdOrgID);
    model.SetValue(i, COL_ORG_NAME, list[i]._holdOrgName);
    model.SetValue(i, COL_FOLDER, list[i]._folder);
    model.SetValue(i, COL_FILE_NO, list[i]._fileNo);
    model.SetValue(i, COL_FILE_NAME, list[i]._fileNameFormat);
    model.SetValue(i, COL_MAKE_PG, list[i]._makePG);
    model.SetValue(i, COL_TRANS_TYPE, ConvertTransTypeToString(list[i]._transType));
}
_ActiveSheet.Models.Data = model;

http://tryinsights.blogspot.kr/2012/09/farpoint-spread-defaultsheetdatamodel.html 에서 설명한 것과 같이 DefaultSheetDataModel class를 이용한다.

테스트를 해보지 않아 어느 방식이 어떤 상황에서 더 효율적이다 라고 말하긴 어렵다.

하지만 후자 방식이 좀더 빠를 것 같은 느낌(?)이 든다.

그냥 느낌이다-_-;


FarPoint Spread의 DefaultSheetDataModel

FarPoint Spread에는 DefaultSheetDataModel 이라는 Class가 존재한다.

이 Class는 다음과 같이 사용할 수 있다.


private void PrintSpreadProcessChkMaster(IList<Hashtable> result)
{
    DefaultSheetDataModel model = new DefaultSheetDataModel();
    model.RowCount = result.Count;
    model.ColumnCount = COL_MAX;

    for (int i = 0; i < result.Count; i++)
    {
        model.SetValue(i, COL_ORG_ID, result[i]["HOLD_ORG_ID"].ToString());
        model.SetValue(i, COL_ORG_NAME, result[i]["HOLD_ORG_NAME"].ToString());
        model.SetValue(i, COL_FOLDER, result[i]["FOLDER"].ToString());
        model.SetValue(i, COL_FILE_NO, result[i]["FILE_NO"].ToString());
        model.SetValue(i, COL_FILE_NAME, result[i]["FILE_NM_FORMAT"].ToString());
        model.SetValue(i, COL_MAKE_PG, result[i]["MAKE_PG"].ToString());
        model.SetValue(i, COL_TRANS_TYPE, ConvertTransTypeToString(result[i]["TRANS_TYPE"].ToString()));
        model.SetValue(i, COL_MSG_SEND_YN, result[i]["MESSAGE_SEND_YN"].ToString() == "1" ? true : false);
        model.SetValue(i, COL_CHK_TIME, SetCheckTime(result[i]["CHK_TIME"].ToString()));
        model.SetValue(i, COL_CHK_ID, result[i]["CHK_ID"].ToString());
    }
    _ActiveSheet.Models.Data = model;
}

http://tryinsights.blogspot.kr/2012/08/c-farpoint-spread-activesheet.html 에서 설명한 것처럼 _ActiveSheet 변수를 설정한 후, 위와 같이 DefaultSheetDataModel class를 사용하여 Spread에 데이터를 출력한다.

C#에서 FarPoint Spread control

C#에서 FarPoint Spread  컨트롤 방법은 다음과 같다.

Column Header의 Label 변경

this.fpSpread1_Sheet1.ColumnHeader.Cells.Get(0, 1).Value = "상태";
this.fpSpread1_Sheet1.ColumnHeader.Cells.Get(0, 2).Value = "기관코드";
this.fpSpread1_Sheet1.ColumnHeader.Cells.Get(0, 3).Value = "기관명";


Column의 폭(width) 설정
this.fpSpread1_Sheet1.Columns.Get(0).Width = 48F;

Column의 값을 사용자가 수정하지 못하도록 설정
this.fpSpread1_Sheet1.Columns.Get(1).Locked = true; 

특정 Column에 속한 Cell Value의 정렬
this.fpSpread1_Sheet1.Columns.Get(6).VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center;
this.fpSpread1_Sheet1.Columns.Get(7).HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Left; 

Column Hidden 처리
this.fpSpread1_Sheet1.Columns.Get(9).Visible = false; 

Row Header Hidden 처리
_fpUserList.RowHeader.Visible = false; 

Column의 Size 변경 불가
_ActiveSheet.ColumnHeader.Columns.Default.Resizable = false; 
Column Header를 눌렀을때 Sorting
_fpHoldOrgList.Columns.Get(SP_HOLD_ORG_LIST_HOLD_ORG_ID, SP_HOLD_ORG_LIST_FOLDER).AllowAutoSort = true; 
CheckBox 사용
FarPoint.Win.Spread.CellType.CheckBoxCellType checkBoxCellType6 = new FarPoint.Win.Spread.CellType.CheckBoxCellType();

this.fpSpread1_Sheet1.Columns.Get(8).CellType = checkBoxCellType6; 

Oracle SQL Developer 훓어보기

Oracle SQL Developer를 설치했다.

Toad는 제대로 사용하지 못해봐서 잘 모르겠고, 주로 사용하는 Golden 보다는 성능이 좋은 것 같다.

성능이 낫다고 말하긴 애매하구나. 성능이라기보다는 편의성이 나은것 같다.

Oracle SQL Developer의 기능을 간략히 설명하자면...

Query Builder 가 있다.
MS의 Access를 생각나게하는 인터페이스를 가지고 있다.
일단 Drag & Drop이되고 sql로 select 하는 거의 모든 작업을 처리할 수 있을 듯 하다.
선책한 object의 이름을 변경할 수도 있고, 조회 결과를 sorting할 수도있다.

SQL Tuning Advisor 도 있는데 잘 사용하게 될지는 의문.

Exporting 기능을 앞으로 자중 사용하게 될 것 같다.
여러가지 조건을 넣어서 .sql 파일로 만들 수 있고, 데이터도 html, csv 등의 format으로 생성할 수 있는 듯하다.

Importing 기능은 시간상 생략.

Database Navigator 기능은 ADMIN 관련 기능인듯한다. Oracle 설정값 등을 확인할 수 있는데 내가 쓸일이 있을까?

DBMS Schedule는 MS-SQL의 DTS와 유사한 기능인듯하다.
잘쓰면 매우 유용할듯. 상당히 visual 하게 작업을 보여준다. 당연히 예약작업도 되고.

Explain Plan Diff.
이건 정말 많이 사용할 듯하다. Golden에서는 예상되는 plan을 보여주는 정도였는데, 여기서는 유사한 두개의 Plan을 비교할 수도 있다. 잘 써먹어봐야겠다.

시간이 부족해 이정도만 확인해봤는데, Reporting 기능도 있고, 11g에서만 사용되는 기능도 있는듯 하다.

현재 버전은 Oracle SQL Developer 3.2 (3.2.09.30)이고 위의 기능설명은 3.0 기준이다.

3.1과 3.2의 New Features 도 시간관계상 확인을 못했다.

이 글도 시리즈 물이 되려나...

linux cluster, oracle 관련 참고사이트

linux에 oracle을 설치하고 cluster를 구현할 수 있는 방법을 검색하다가 좋은 사이트를 발견했다.

시스템 엔지니어 공동 관리 구역 - http://blog.syszone.co.kr/

클루닉스에 재직중(? 아직도 재직중이신지는 모르겠다.)이신 서진우님이 운영하시는 blog 인 듯하다.

앞으로 회사 시스템이 Solaris에서 RedHet Linux로 전환될 가능성이 높아보이는데 이 사이트에서 얻을 수 있는 정보가 많이 보인다.

검색해서 발견했던 페이지는 요것. - 리눅스 클러스터 종합기술백서 http://blog.syszone.co.kr/2784

...

linux에 oracle을 설치하고 cluster를 구현할 수 있는 방법은 확인 못했다 -_-;

2012년 9월 11일 화요일

TPC - Transaction Processing Performance Council


1988년에 34개 소프트웨어 및 하드웨어 업체가 Transaction Processing Performance Council (TPC)을 공동으로 설립.

TPC에서 TPC-A, TPC-B 등의 벤치마크 방식을 제안.

현재 A, B 등은 사용되지 않고, 의미있다고 여겨지는 TPC 벤치마크는 TPC-App, TPC-C, TPC-E, TPC-H 등이다.

참고
TPS - Transaction Per Second의 약자로 초당 처리할 수 있는 트랜잭션의 수를 의미

관련링크
DBMS 벤치마크와 벤치마크 전쟁 - http://altistory.net/672



아래 내용은 레디시스템 홈페이지에서 발췌
http://www.readysystem.co.kr/ready/bbs/board.php?bo_table=tech_solaris&wr_id=147&page=4




TPC-C Overview

http://www.tpc.org

비교적 복잡한 OLTP 트랜잭션
TPC 조직이 2 년에 걸쳐 개발한 결과 전형적인 주문입력 시스템을 기본 구조로 설정하여 벤치마크를 위한 개념 설립
주문관리 도매상 어플리케이션을 모델로 설정
5개 유형의 트랜잭션으로 구성된 워크로드
처리량에 따른 사용자 및 Database의 증가
Full-Screen 사용자 인터페이스를 SPEC 정의
1분 당 신규 주문 처리 건수(tpmC) 및 가격 대비 성능($/tpmC)에 대한 값을 측정
1992년 7월 23일 TPC-C 테스트 승인
현재 Version 5 발표


  • TPC-C Workload

OLTP Transaction 유형 (80년대말~90년대초 표준)

New-order : 고객으로부터 새로운 주문 입력
Payment : 고객의 지불 처리 및 잔고 Update
Delivery : 주문 처리 (Batch 작업)
Order-status : 고객의 가장 최근 주문 상태 확인
Stock-level : 창고의 재고현황을 모니터링

한 개의 Database와 9개의 Table로 구성
Update, Insert, Delete 및 Abort Transaction으로 구성 (Primary or Secondary Key Index).
응답시간 요구사항 : 90% 이상의 Transaction이 5초 이하의 응답시간, Stock-level Transaction의 경우는 20초 이하



TPC-H Overview



  • TPC-H Benchmark (DW, BI)

의사 결정 시스템과 같은 Decision Support Benchmark Test
실제 비즈니스 상황을 반영한 대용량 Database에 대한 복잡한 22개의 Ad-hoc 쿼리 및 2개의 데이터 조작 문장으로 구성



  • TPC-H에 사용되는 쿼리문

실제 비즈니스 상황에서 필요로 하는 ad-hoc 쿼리문으로 구성
일반적인 OLTP 트랜젝션에 비해 훨씬 복잡함
광범위한 조작과 제약(Constraints) 포함
CPU 성능 외 Memory, I/O 등 데이터베이스 전반적인 부품에 대한 집중적인(intensive) 부하 발생
대용량의 데이터베이스에 대한 요구



  • TPC-H 단위

QphH@Size (TPC-H Composite Query per Hour)
Size는 Benchmark에 사용된 데이터베이스의 크기로 1GB, 10GB, 30GB, 100GB, 300GB, 1000GB, 3000GB, 10000GB의 몇 가지 지정된 크기를 명시함. 이 Database 크기는 Scale Factor(SF)로 TPC-H 산출 공식에서 사용
사용된 Database의 크기가 1GB 이면 SF=1, 3TB이면 SF=3000



  • TPC-H의 결과

TPC-H 값이 3000 QphH@300GB라면 이 수치의 의미는 300GB 용량의 Database에서 3000/300 = 10개의 Adhoc Query를 한시간에 수행할 수 있는 능력을 의미 (SF=300)
Database의 Size가 다른 QphH의 비교는 무의미하며 잘못된 결과를 초래할 수 있으므로 주의


참고 - SPEC : SPEC[스펙]은 여러 컴퓨터 및 마이크로프로세서 공급자들이 벤치마크 테스트의 표준을 만들기 위해 1988년에 설립한 비영리기관이다.


SPEC Overview


http://www.spec.org
Standard Performance Evaluation Corporation



  • SPECcpu2000

Processor, Memory, Compiler 등과 같은 Unit이 얼마나 뛰어난가 측정하는 표준
정수 및 실수 (부동 소수점) 에 대해 연산 위주의 작업을 수행하여 결과를 측정
SPECint: 하나의 정수연산을 얼마나 빠르게 수행하는가? Speed에 대한 측정
SPECfp: 하나의 실수연산을 얼마나 빠르게 수행하는가? Speed에 대한 측정
SPECint_rate: 주어진 시간동안에 얼마나 많은 정수연산 작업을 수행하는가? 대역폭에 대한 측정
SPECfp_rate: 주어진 시간동안에 얼마나 많은 실수연산 작업을 수행하는가? 대역폭에 대한 측정




  • SPECweb

SPECweb96: 정적 환경의 Web Server에 대한 성능 측정 (HTML, Image Downloading)
SPECweb99: 동적 환경의 Web Server에 대한 성능 측정 (DHTML, CGI etc)
SPECweb_SSL: SSL 기반의 암호화 기법이 적용된 Web Server에 대한 성능 측정



Oracle(또는 DB) 성능 측정 방법 1

제목에 1이란 숫자를 붙인건 이 주제와 관련된 글을 앞으로도 계속 쓸 것 같은 예감이 들었기 때문이다.

DB Migration, DB 교체 또는 신규 DB System 도입이라는 타이틀이 붙은 업무를 진행해야 하는데, 도대체 성능측정은 어떻게 해야 하는지 감을 잡을 수가 없다.

현재 성능이 어떠한지 확인이 되야 새로 도입하는 DB System은 어느 정도의 spec이 적당한지 판단이 될텐데 어떤 근거로, 어떤 방법으로 확인해야 하는걸까?

이러저러한 이유로 Oracle(또는 DB) 성능 측정 방법을 검색하다 보니 Hammerora라는 Open Source Oracle Load Test Tool 을 발견했다.

TPC-C, TPC-H 등 요즘 주로 사용하는 성능측정 방법을 구현해 놓은 tool 이라고 한다.

한번 사용해 볼까 싶기도 하고... 이걸 꼭 해야 하나 싶기도 하고... 심난한 요즘이다.

제목은 그럴싸하게 붙여 놓고 잡담밖에 없구나.

Hammerora에 국한되지 말고 Oracle의 성능을 측정할 수 있는 방법을 계속 확인하고 기록해보자.

2012년 9월 10일 월요일

Preforce Merge(P4Merge), KDiff3 + TortoiseSVN사용방법

Preforce Merge(P4Merge), KDiff3 + TortoiseSVN사용방법

http://a.tk.co.kr/607

다음 설치시 방황하지 않기 위해.

Solaris 기본 정보 확인

운영체제의 기본정보
uname -a

SunOS console 5.10 Generic_137111-01 sun4u sparc SUNW,Sun-Fire-V210

운영체제의 기본정보
uname -X


System = SunOS
Node = console
Release = 5.10
KernelID = Generic_137111-01
Machine = sun4u
BusType = <unknown>
Serial = <unknown>
Users = <unknown>
OEM# = 0
Origin# = 1
NumCPU = 1

전반적인 상태점검
prtdiag -v


CPU 정보

psrinfo -v
가상 프로세서 0개의 상태: 09/10/2012 21:28:39
  온라인(01/29/2012 13:05:06 이후).
  sparcv9 프로세서는 1002 MHz로 작동합니다.,
        sparcv9 부동점 프로세서가 있습니다.

psrinfo -pv

물리적 프로세서에 1 가상 프로세서 있음(0)
  UltraSPARC-IIIi (portid 0 impl 0x16 ver 0x24 clock 1002 MHz)


물리적 메모리 정보

prtconf | grep Memory
Memory size: 2048 Megabytes


가상 메모리 정보

swap -l
swapfile             dev  swaplo 블록   사용 가능
/dev/dsk/c1t0d0s1   32,1      16 8388096 8388096


swap -s
총: 913936k 바이트 할당 + 36416k 예약 = 950352k 사용, 4800120k 사용 가능



IP 설정 확인
ifconfig -a



Routing Table 확인
netstat -nr



DNS Client 설정 확인
cat /etc/nsswitch.conf

cat /etc/resolv.conf







WebDAV

WebDAV : 웹하드디스크를 구현할 수 있고, FTP를 통하지 않고 HTTP 프로토콜을 통해 웹상의 파일을 송수신, 수정, 삭제할수 있는 프로토콜.


1. WebDAV란 무엇인가?

WebDAV는 Web-based Distributed Authoring and Versioning (웹기반 분산형 저작 및 버전관리)의 약자로 웹을 통하여 웹서버에 파일을 관리(목록 조회, 수정, 삭제, 이동 등)할 수 있는 확장된 HTTP 프로토콜을 말한다.

WebDAV 특징

- 파일 락킹(file locking) 지원 : 여러 명이 동시 접근이 가능한 웹에서 overwrite하는 것을 막는다.
- XML을 사용하여 데이터를 교환 (물론 사용자는 XML을 몰라도 된다.)
- 설정은 간단하지만 효과는 만점
- 쉬운 접근 제어
- 웹하드디스크 구현 가능


사이냅소프트

SQL AntiPattenrs을 읽다가 역자 소개에 "사이냅소프트에 근무한다." 는 문구가 눈에 들어왔다.

사이냅 소프트.

어디선가 많이 들어본 회사다.

궁금해서 찾아봤다.

문서 필터링(MS-Office, 한글 등에서 text 추출), Web Office 등을 주로 개발하는 회사.

개발자의 하루, 재교육 소개, 조엘 테스트 등 인력채용 홈페이지도 꼼꼼하게 잘 만들어 놓은게 인상적이었다.