1. top & vmstat로 서버의 부하상태를 확인
[root@localhost ~]# top
top - 16:50:02 up 6 days, 18:34, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 72 total, 1 running, 71 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0% us, 0.0% sy, 0.0% ni, 100.0% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 515536k total, 505444k used, 10092k free, 48972k buffers
Swap: 1052248k total, 1480k used, 1050768k free, 116768k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 16 0 2668 548 468 S 0.0 0.1 0:03.53 init
2 root 34 19 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/0
3 root 5 -10 0 0 0 S 0.0 0.0 0:00.32 events/0
4 root 7 -10 0 0 0 S 0.0 0.0 0:00.02 khelper
5 root 15 -10 0 0 0 S 0.0 0.0 0:00.00 kacpid
17 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 kblockd/0
18 root 15 0 0 0 0 S 0.0 0.0 0:00.00 khubd
35 root 15 0 0 0 0 S 0.0 0.0 0:00.36 pdflush
36 root 15 0 0 0 0 S 0.0 0.0 0:00.25 pdflush
<중간생략>
[root@localhost ~]# vmstat 1 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 1480 10156 49000 116788 0 0 2 6 49 44 0 0 100 0
0 0 1480 10156 49000 116788 0 0 0 0 1006 39 0 0 100 0
0 0 1480 10156 49000 116788 0 0 0 0 1004 52 0 0 100 0
0 0 1480 10156 49000 116788 0 0 0 0 1004 37 0 0 100 0
0 0 1480 10156 49000 116788 0 0 0 0 1005 40 0 0 100 0
프로세스 메모리 스왑 하드(IO) 시스템/네트웍 CPU
[top]
1. uptime
uptime이 너무 길어도 시스템이 자원을 효율적으로 사용하지 못하는 경우가 생긴다.
>>한달 ~ 두달정도에 한번은 리부팅 권장
2. load average
앞에서 부터 1분간, 5분간, 10분간 CPU가 처리못하는 프로세스의 평균을 말한다.
>> 10만 넘어도 서버에 부하가 극심하다.
3. CPU
1) cy
사용자가 사용하는 CPU의 양을 나타낸다.
>> top상에서나 프로세스 리스트로 확인하여 불필요한 것이면 kill하고 정상적인 프로세스가 많은 양을 차지하고 있다면 시스템의 자원이 부족한 것이다.
2) sy
시스템이 사용하는 CPU의 양을 나타낸다. (커널모드로 넘어간 상태)
>> 부팅중이거나, 파일시스템체크 등의 시스템상에서 작업중이 아닌이상 정상운영 중인 서버에서는 거의 발생을 하지 않는 것이 정상이다.
>> 50%이상이 지속적으로 발생할 경우 IO에 문제가 있는 것이다.
3) id
CPU가 쉬고 있는 것을 나타낸다.
>> 만약 다량의 메모리 사용 및 스왑이 일어나고 실제 시스템에 부하가 생기고 있는 id가 높으면 CPU 장치의 문제이다.
4. MEM
메모리는 전체 = 버퍼 또는 캐쉬 + 프리 의 비례로 효율적으로 메모리 자원을 사용하는지 확인한다.
>> used가 많다고 무조건 메모리가 부족한 것이 아니라, used가 오디에 사용되고 있는지 판단해야 한다.
>> 서버의 부하는 극심한데 메모리가 계속 버퍼없이 프리로 잡혀있다던지, 계속 버퍼로만 사용되고 있으면 시스템이 메모리를 제대로 사용하고 있지 못하고 있는 것이다.
5. swap
메모리의 경우와 마찬가지로 서버 부하에 따른 적절한 스왑이 발생해 줘야 한다.
[vmstat]
top에서 확인한 내용을 vmstat로 추가 확인
1 프로세스
r : 실행되고 있지 못하는 프로세스의 수를 말하는 것으로 3이상이면 부하상태로 볼 수 있다.
2. 메모리
top에서 보다 자세하게 사용현황을 알 수 있다.
3. 스왑
스왑 인/아웃의 발생양을 알 수있다.
1) so(스왑아웃)
스왑이 메모리로 할당된 양, 이 양이 많다면 서버의 부하상태를 확인
>> 부하가 없는데 스왑이 많이 발생하고 있다면 시스템에 문제가 있다
>> 시스템에 부하가 많은데 스왑이 발생하고 있다면 시스템이 자원을 효율적으로 사용하고 있지 못하고 있다.
2) si(스왑인)
스왑아웃된 내용이 다시 필요하게 될 경우 이을 다시 불러오는 것
4. IO
1) bo : block device로 부터 받은 blocks
>> 하드디스크가 어떤 명령에 의해 사용되고 있는 정도를 말한다.
>> 지나치게 높으면 하드에 문제가 있는 것
2) bi : block device에 보낸 blocks
>> 외부 요청에 의해 하드가 사용중인 것을 말한다.
5. system
1) in : 인터럽트를 말하며, 버퍼/캐쉬로 저장된 내용의 작업이 아닌 요청이 들어올 경우 발생한다.
>> 대량의 인터럽트가 불규칙 발생할 경우 문제가 있는 것이다.
2) cs : 초당 발생한 context switches (문맥교환)의 수
>> 쉽게 말해 네트워크 부하를 말한다.
6. CPU
top에서의 내용과 유사, wa 작업요청대기 중
# 추가적으로 top에서 us가 높으면 프로세스 리스트에서도 확인 해 볼 필요가 있다.
[root@localhost ~]# ps aux | sort +4n | tail -10
daemon 11687 0.0 6.7 335052 34968 ? Sl Oct24 1:00 /usr/local/apache/bin/httpd -k start
daemon 11685 0.0 6.6 335188 34236 ? Sl Oct24 0:55 /usr/local/apache/bin/httpd -k start
daemon 11682 0.0 6.6 335740 34360 ? Sl Oct24 1:00 /usr/local/apache/bin/httpd -k start
daemon 11678 0.0 6.6 335760 34268 ? Sl Oct24 1:02 /usr/local/apache/bin/httpd -k start
daemon 11689 0.0 6.7 336552 34568 ? Sl Oct24 0:58 /usr/local/apache/bin/httpd -k start
daemon 10726 0.0 6.6 336688 34264 ? Sl Oct24 1:01 /usr/local/apache/bin/httpd -k start
daemon 11676 0.0 6.6 336776 34248 ? Sl Oct24 0:59 /usr/local/apache/bin/httpd -k start
daemon 11648 0.0 6.7 336868 34852 ? Sl Oct24 1:00 /usr/local/apache/bin/httpd -k start
daemon 11681 0.0 6.7 338108 34776 ? Sl Oct24 1:02 /usr/local/apache/bin/httpd -k start
mysql 2441 0.0 12.3 538464 63428 ? Sl Oct22 3:15 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql --pid-file=/usr/local/mysql/data/localhost.localdomain.pid --skip-external-locking --port=3306 --socket=/tmp/mysql.sock
[apache]
1. 증상 : apache 데몬은 살아 있고 사이트가 아예 안뜬다면,
- MaxClinet 의 문제일 가능성이 많다.
>> ps aux | grep httpd 해서 엄청나게 많이 뜨면, httpd.conf에서 MaxClinet 확인
2. 증상 : apache 데몬은 살아 있고, 사이트가 뜨지만 아주 느리게 뜬다.
- apache logs 가 2G가 넘지 않는가 확인
[root@localhost ~]# cd /usr/local/apache/logs/
[root@localhost logs]# du -sh
2.7G
-df 파티션 용량이 꽉차지 않았나 확인
[root@localhost logs]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/hda3 ext3 1012M 256M 705M 27% /
/dev/hda1 ext3 99M 23M 72M 24% /boot
none tmpfs 252M 0 252M 0% /dev /shm
/dev/hda9 ext3 15G 70M 15G 1% /home
/dev/hda8 ext3 494M 11M 458M 3% /tmp
/dev/hda7 ext3 4.9G 1.1G 3.5G 24% /usr
/dev/hda5 ext3 9.7G 9.7G 0M 100% /usr/local
/dev/hda6 ext3 4.9G 144M 4.5G 4% /var
- 웹소스상에 include이 있는가 확인
>> include 된 사이트의 접속상태를 확인.: include된 사이트의 MaxClients 문제의 가능성이 있다.
>> 소스에 include에 많으면 사이트가 느릴 수 밖에 없다.
3. 증상 : 사이트는 빠르게 뜨는 편이나 db 관련된 부분이 느리게 로딩 됨
>> dbl쪽의 부하
>> db 서버가 분리도어 있다면 웹서버가 아닌 db 서버에서 부하가 생긴 것이다.
4. 서버에 부하도 없고 apache 설정상에 문제가 없는데 알 수 부하가 계속 발생한다면,
- 2.0.x 버전의 worker 방식으로 설치된 apache라면 prefork로 재컴파일
- 아니면, 아파치 버전을 2.2.x 버전으로 올린다.
5. KeepAlive On / off
- 도메인이 커뮤니티 또는 다중도메인 호스팅의 경우, --> off
>> netstat -anp 상에서 80포트로 여러곳에서 많은 양의 접속자가 있을 시
- 도메인수가 적고, 접속자가 그렇게 많지 않거나, 집중되지 않는다면 --> On
>> Timeout 값은 default 30에서 15또는 10으로 낮춰주는 것이 과도한 부하 발생을 예방할 수 있다.
[mysql]
1. 프로세스리스트 확인 (실시간 디비쿼리 확인)
[root@localhost ~]# mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 11977 to server version: 5.0.27-log
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql> show processlist;
+-------+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host | db |Command| Time| State | Info |
+-------+------+-----------+------+---------+------+-------+------------------+
| 11977 | root | localhost | NULL| Query | 0 | NULL | show processlist |
+-------+------+-----------+------+---------+------+-------+------------------+
1 row in set (0.00 sec)
프로세스 ID time 값과 state를 확인한다.
>> time 값이 크면 클 수록 쿼리에 부하가 생기고 있다는 것이다.
2. mysqladmin -p status
[root@localhost ~]# mysqladmin -p status
Enter password:
Uptime: 585141 Threads: 1 Questions: 49402 Slow queries: 0 Opens: 112 Flush tables: 1 Open tables: 106 Queries per second avg: 0.084
>> 여기서는 가장 중요하게 확인 해야 할 부분이 한 쓰레드가 처리되는데 초당 평균이값이다.
3. 테이블수와 db용량 확인
>> 너무 많으면, 부하가 발생하는 것이 정상이다.
[root@localhost logs]# mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 11997 to server version: 5.0.27-log
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql> use mysql;
Database changed
mysql> show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| func |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| host |
| proc |
| procs_priv |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
17 rows in set (0.00 sec)
[root@localhost ~]# cd /usr/local/mysql/data
[root@localhost data]# du -sh
36M