서버사양으로는
모델명 : Compaq PLT7000
CPU : Pxeon 500*4,
MEM : 4 Gbyte
OS : Win 2000 Server
HDD : RAID 5 구성
DB : ORACLE8i( v8.1.7.1.5)
현 오라클의 상태
: 현재 튜닝상태는 좋은것같구요 (튜닝팩하고 sql문으로 조회를 해보면 좋게 나와요)
일주일에 한 두번 정도 갑자기 부하가 걸려 client 접속 문제하고 오라클이 죽는 현상이 일어남
주로사용하는 유저는 call center하고 각 대리점( 서비스업체 입니다)
1. cpu사용량이 많아지고 세션의 active 상태( v$session의 status=active )인것이 많아 졌을때
오라클이 죽어버리는 경우가 발생
세션이 많이 붙어 메모리상에 문제인지 어떤문제인지 확실히 모르겠습니다.?
원도우의 작업관리자
: 커널 시간표시(빨간색) 70%이상 부하가 가고 전체 cpu 사용량은 90% 이상갈때
Client가 서버에 접속시 Dedicate server 방식을 쓰는데 보통 850세션이 붙습니다.
v$session에서 status가 15개 이상있고 갑자기 수십개가 발생하여 query(SQLPlus상, 서버에서도)를
날리면 hang이 걸린것 처럼 한참 있어야 응답이 옴.
2. 오라클에 메모리 할당을 많이주는 방안은 없는지요. (밑의 방법으로 쓸려면 어떻게 해야 하는지요)
작업관리자에서 oracle.exe가 650~ 750 MByte를 쓰고있다.
내용마다 점선 아래는 인터넷에서 읽은내용임
-------------------------------------------------------------------------------
[Tip] 윈도우용 오라클에서 memory 효율적인 사용방법
오라클이 의외로 많은 자원(memory)을 사용하죠.
그래서 dedicate server인 경우에는 메모리가 많이 필요하죠.
그래서 메모리 사용에 대한 튜닝이 약간은 필요한데 그중에서 한가지 오라클은 한사람이 접속을 하게
되면 1개의 process를 줍니다.
윈도우의 경우 그 process에서 1MB짜리 thread를 만들어 냅니다.
그런데 실제로 사용하는 메모리는 300K뿐입니다. 그러므로 700K는??
놉니다. 그래서 실제 자원을 할당할때 아예 1MB가 아니라 500K정도만
주게 하면 1000명이 동시에 접속하게 되면 500MB만 필요하게 되죠.
orastack 명령을 이용하여 1M를 500K로 바꿀수 있는데요
명령문은
orastack oracle.exe 500000
이런식으로 하면 됩니다. ( 중요한건 300K 아래로는 하지 않는게 좋습니다. )
메모리가 모잘라서 ora-12514 같은 error 나시는 분들 한번 시도해 보는게
-------------------------------------------------------------------------------
=============> ora-12514 에러는 나지 않은데 이방법을 해도 될까요?
======================================================================
[Tip] 윈도우용 오라클에서 메모리 2GB 한계 넘기
만약 윈도우용 오라클을 사용하시는데 2GB 이상의 메모리를 사용하고 계신다면
운영체제에서 지원 안한다는것을 아시고 계실겁니다.
윈도우는 총 4GB 의 메모리까지 지원을 하는데 커널에서 2GB , 어플리케이션은 2GB
를 사용하도록 되어 있습니다. 그러므로 4GB 의 메모리를 장착해도
실제로는 오라클은 2GB 이상은 사용하지 못하게 되는거죠.
해결방법은
윈도우의 boot.ini 파일을 열어서 끝에다가 /3GB 라고 추가를 해주세요
그렇게 하고 리부팅을 하면 커널이 1GB 어플리케이션이 3GB를 사용할 수 있게
됩니다.
그리고 어플리케이션 자체가 2GB 이상을 쓸수 없게 되어 있기 때문에 oracle.exe 파일을
2GB 이상을 쓸 수 있게 만들어 줘야 하는데 그걸 imagecfg.exe 파일이 해줍니다.
이 파일은 windows NT Enterprise 4.0 이나 Windows 2000 DataCenter 버젼에만
이걸 구하 신후 imagecfg.exe -l oracle.exe 이렇게 하면 oracle.exe 가 2GB 이상을
사용할 수 있는 형태로 변형이 됩니다.
그럼 오라클에 3GB도 사용할 수 있겠죠.
======================================================================
==========> windows 2000 Server에선 사용할수 없는가요 그리고 이방법을 쓰면 좋을지 조언 부탁?
3. 서버의 락이 걸리는 현상이 한꺼번에 나타나서 DB가 접속이 잘 안되고 서버에서 kill 까지 잘
안먹는 상태가 자주 발생하여 DB를 shutdown 해야 하는 상황이 종종 발생하는데 뭐가 잘못되고 어떻게 조치해야 하는지 조언 부탁드립니다.
보통의 경우 status가 active 인것이 15개 미만으로 나타납니다. 이렇게 부하가 갈때는 active session이 수십개씩 발생하고 락까지 발생하면
어떻게 조치할 방도가 없습니다. 그냥 리부팅 방법이외는..
제생각에는 사용자들이 비정상적인 종료로 인해서 session이 남아있는 상태인것 같습니다.
==========> sqlnet.ora에 sqlnet.expire_time = 15 로 설정을 잠시 사용 해봤었는데
session이 800개도 안되었는데 잘 붙지 않는 상황이 발생해서 이제 사용하고 있지 않습니다.
그렇다고 MTS방식을 쓸려고 고려해 보았지만 현재 상태도 느리다고 하는데 MTS를 쓰면 더 느려지지 않을까요
====================================================================================
client-server환경에서 비정상 종료된 session정리 방법
==========> sqlnet.expire_time=n
server에서 수행 중이던 프로그램이 비정상 종료한 경우에는 오라클의 smon이
자동으로 detection하여 수행 중이던 transaction을 rollback하여
정리하여 준다.
그러나, Client Server 환경에서 PC를 Client로 사용 시 비정상적인 방법으로
Server와 Disconnect 하면 Server 쪽에 있는 Dedicated Server가 남아 있다.
이는 Sql*net V1 & V2에서 발생하던 문제로 Sql*net V2.1 이후에는 아래와
같은 방법을 이용하면 Dead connection이 정상적으로 Disconnect 된다.
* 환경 : Server - Sql*net tcp/ip V2.1.3
Client - Sql*net V2.0
* Setup 방법 : Server와 Client에 있는
$ORACLE_HOME/network/admin/sqlnet.ora에
sqlnet.expire_time=n
으로 setting 한다.
여기서 n은 분 단위이며 실제 disconnect는 n분보다 더 걸린다.
일반적으로 sqlnet.expire_time=1로 설정하면 적당하다.
====================================================================================
4. initSID.ora 파일에서
alter session kill session 명령시 ora-00030, 00000, "user session ID does not exist" :
DB에 부하가는 시간대에 에러가 발생하는데 밑의 방법은 개선점이 되는지요
=========> cleanup_rollback_entries(default = 20) 설정을 어느정도하면 좋겠습니까?
하루에 처리하는 lock 걸린세션을 20개 이상 kill하는데 이렇게 많이 나는 원인이 어떻게 되는지요?
--- Problem
사용자는 다음과 같은 상황에서 session 을 kill 하려는 시도를 하게 된다.
1. os 에는 process 가 존재하지 않지만, v$session 에는 active 로 존재하고
있을 경우
2. shadow process 는 살아 있는데, client machine 을 rebooting 한 경우
3. session 이 걸고 있던 lock 을 release 해야 할 경우
4. OS 나 Oracle 의 자원을 지나치게 많이 사용하여 성능을 저하시키는 process
그런데, alter system kill session ('sid, serial#'); 후에 다음과 같은
에러가 발생할 경우가 있다.
ora-00030, 00000, "user session ID does not exist"
// *Cause: The user session id no longer exists, probably because the
// session was logged out.
// *Action: Use a valid session ID.
--- 원인과 대책
kill session을 할 수 없는 이유는 PMON이 이미 이 session을 delete하고 있는
중이기 때문이다. 즉, PMON 이 dead session 을 clean-up 하고 있는 중에는
serial number의 값이 증가한다.
문제는 PMON이 process를 kill하는 시간인데, transaction의 크기에 따라,
PMON의 rollback 시간이 결정된다. 먼저 PMON은 dead process를 찾아내어,
이 process가 사용한 resource 를 release하는 시도를 한다.
PMON은 계속 이 작업을 시도하다가 마침내, free buffer의 부족으로 더 이상
resource를 free-up 하지 못하게 된다.
이 때, 이 process를 delete하고 있다는 message를 trace file에 출력하는데,
이것은 process를 delete하는 데 필요한 resource(data cache 내의 free buffer)
의 부족으로 위의 작업이 지연되고 있다는 의미이다.
PMON이 process 를 clean-up 할 때 걸리는 시간은, 5분에서 24 시간까지 소요
될 수 있다. 문제는 이 process가 hold 하고 있는 lock으로 인해 특정 작업이
수행되지 못하는 데 있다. MTS 를 사용할 때는 configuration MTS setting,
sqlnet.expire_time 사용)에 따라 다르지만, clean-up 작업을 하는데 72 시간이
소요된 경우도 있다.
아직까지는 PMON이 작업을 마칠 때까지 기다리는 방법 또는 db를 restartup하는
방법 밖에는 없다.
--- PMON 의 작업
===========> cleanup_rollback_entries(default = 20)
PMON은 network failure 나 기타의 원인으로 생긴 old process connection을
clean-up 하는 역할을 한다. 그런데, PMON 은 clean-up 해야 하는 connection
중에 정해진 개수 만큼의 transaction 을 rollback 할 수 있는데, 이 값은
initSID.ora 의 cleanup_rollback_entries(default = 20) 에 의해 결정된다.
예를 들어, 1000 개의 uncommitted update가 있다면, 일정한 시간마다
cleanup_rollback_entries 의 개수 만큼의 record 만 rollback 할 수 있으므로
이 작업 동안에 lock 은 그대로 유지된다.
PMON 은 위의 작업 이외에 DB maintenance 역할이 있으므로, 위의 rollback 이
비교적 빠르게 처리되지 못할 수도 있다. 이러한 rollback을 빠르게 처리하기
위하여 cleanup_rollback_entries 를 늘릴 수도 있다. 그러나, 그 만큼 일정
시간 동안 PMON 의 작업이 많아지게 되므로, 다른 사용자들의 작업 요청이
느려지게 되는 trade-off 가 있으므로, 신중히 고려한 후에 수정하는 것이
바람직하다.
alter system kill session 에 의해서도 위와 같이 rollback 이 이루어지는데,
이 session 이 완전히 clean-up 되기 전까지 v$session, v$process에 남아 있게 된다.
init.ora : 참고.
======================================================================
db_files = 30
control_files = ("D:\ora817\dbs\ctl1svc2.ora", "D:\ora817\dbs\ctl2svc2.ora")
db_file_multiblock_read_count = 32
rollback_segments=(rb0,rb1,rb2,rb3,rb4,rb5,rb6,rb7,rb8,rb9,rb10)
db_block_buffers = 102400
#shared_pool_size = 500000000 ##오라클 추천사항 : MTS방식 사용시
shared_pool_size = 102400000
log_checkpoint_interval = 10000
processes = 2000
sessions=1000
#### LOCKS
dml_locks = 100000
enqueue_resources = 80000
open_cursors = 1200
=============> 이부분에 대해서 설정을 하는게 좋을까요?#### CPU-PARAMETERS
#### CPU-PARAMETERS
# log_simultanies_copies = 2 * number of CPU's
# log_simultanies_copies = 0 (single-processor system)
#LOG_SIMULTANEOUS_COPIES = 6
##SPIN_COUNT = 200
#_cpu_count = 4
log_buffer = 163840
background_dump_dest = D:\ora817\rdbms\trace
user_dump_dest = D:\ora817\rdbms\trace
db_block_size =2048
compatible = 8.1.0
sort_area_size = 262144
log_checkpoint_timeout = 0
remote_login_passwordfile = exclusive
max_dump_file_size = 10240
#### AUTOMATICLY STARTED BACKGROUND PROCESSES
log_archive_start = true
LOG_ARCHIVE_DEST =D:\dbfile\logoff\XXXarc
LOG_ARCHIVE_FORMAT =%t_%s
java_pool_size = 0
=============> MTS 방식으로 한다면 설정은 어떻게? ##### 오라클 MTS추천 설정값
#mts_dispatchers="(address=(protocol=tcp)(host=????))(dispatchers=5)"
#mts_max_dispatchers=10
#mts_servers=5
#mts_max_servers=10
======================================================================
긴내용을 읽어 주시니 고맙습니다.
간단히 요약하면 오라클에서 active session이 많아지고, lock걸리는게 많이 있으면
DB의 접속이 잘 안되는 문제와 DB 죽어버리는 문제 입니다.
도움주신면 감사하겠습니다. 서버환경을 더 알아야 한다면 연락주시면 감사하겠습니다.
그럼 좋은 하루 되세요 ^^
|