티스토리 뷰




증상


어느날 갑자기(?) 웹서버에서 홈페이지 로딩하는 속도가 매우매우 느려졌다.





원인 파악


WEB Server 와 DB Server 존재하며, 

WEB Server에서 DB Server에 연결하여 데이터를 가져오는 방식이다.


홈페이지가 어느 부분에서 느린지, 

각각의 Line 에 runtime 체크를 넣어 어느 부분에서 느려지는 지 먼저 파악하였다.


파악 결과 DB Connection 부분에서 약 5초정도 소요되며, 

DB Connection 이 여러개 있을경우 30초넘게 홈페이지가 로딩되지 않은 경우가 발생했다.


DB 서버로 들어가 Show processlist 를 타이핑하여 연결되었는지를 확인해보았다.



mysql> show processlist;

+--------+----------------------+----------------------+---------------+---------+-------+-------+------------------+

| Id     | User                 | Host                 | db            | Command | Time  | State | Info             |

+--------+----------------------+----------------------+---------------+---------+-------+-------+------------------+

| 660834 | root                 | localhost            | pushdevice    | Sleep   | 23565 |       | NULL             |

| 660835 | root                 | localhost            | pushdevice    | Sleep   | 23542 |       | NULL             |

| 661942 | root                 | localhost            | pushdevice    | Sleep   | 20259 |       | NULL             |

| 661952 | root                 | localhost            | pushdevice    | Sleep   | 20231 |       | NULL             |

| 661973 | root                 | localhost            | pushdevice    | Sleep   | 20186 |       | NULL             |

| 662010 | root                 | localhost            | pushdevice    | Sleep   | 19704 |       | NULL             |

| 665774 | root                 | localhost            | pushdevice    | Sleep   | 10165 |       | NULL             |

| 665933 | root                 | localhost            | pushdevice    | Sleep   | 10035 |       | NULL             |

| 665937 | root                 | localhost            | pushdevice    | Sleep   |  9993 |       | NULL             |

| 666106 | root                 | localhost            | pushdevice    | Sleep   |  9535 |       | NULL             |

| 668306 | root                 | localhost            | pushdevice    | Sleep   |  6674 |       | NULL             |

| 668547 | root                 | localhost            | pushdevice    | Sleep   |  6234 |       | NULL             |

| 669845 | root                 | localhost            | pushdevice    | Sleep   |  3465 |       | NULL             |

| 669846 | root                 | localhost            | pushdevice    | Sleep   |  3433 |       | NULL             |

| 669851 | root                 | localhost            | pushdevice    | Sleep   |  3385 |       | NULL             |

| 669852 | root                 | localhost            | pushdevice    | Sleep   |  3295 |       | NULL             |

| 670538 | root                 | localhost            | mya2billing   | Sleep   |  1875 |       | NULL             |

| 672398 | root                 | localhost            | mya2billing   | Sleep   |   118 |       | NULL             |

| 672399 | root                 | localhost            | mya2billing   | Sleep   |   119 |       | NULL             |

| 672400 | root                 | localhost            | pushdevice    | Sleep   |   118 |       | NULL             |

| 672401 | root                 | localhost            | NULL          | Query   |     0 | NULL  | show processlist |

| 672444 | unauthenticated user | 222.xxxxxxx:43914 | NULL          | Connect |  NULL | login | NULL             |

| 672445 | unauthenticated user | 222.xxxxxxxx:43915 | NULL          | Connect |  NULL | login | NULL             |

+--------+----------------------+----------------------+---------------+---------+-------+-------+------------------+


홈페이지가 30초가량 로딩중일때, 

show processlist 를 타이핑해보면 위와같이 [unauthenticated user] 라고 나와있다.






unauthenticated user ?


unauthenticated user 란 연결 요청은 받았지만, ID/PW/DB 등의 추가정보가 없어서 대기중인 연결이다.

위에서 보는 것처럼 User 나 DB 부분이 NULL 로 비어있다.





Why ?


그렇다면 왜 이런 증상이 발생하는가?


Web 서버에서 IP 주소로 DB 서버로 접근한다.

DB 서버에서는 Web 서버의 IP 를 받아 연결을 등록시켜 놓고, 해당 IP 에 대한 DNS Resolving 을 시도한다.

이 과정에서 DB서버에 등록된 DNS 서버 응답이 느리게 될 경우, ID/PW 등 접속정보를 얻어오는 시도도 자연스레 뒤로 밀리게 된다.





어떻게 해결 ?


그렇다면, 이 문제는 어떻게 해결 할 수 있을까?

아래와 같이 3가지 방법이 존재한다.



1. DNS 서버를 변경

- /etc/resolve.conf 에 등록된 DNS 서버를 변경해 본다.

아래는 DNS 서버 리스트


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
KT olleh (올레; QOOK()), KT DNS
기본 DNS 서버 주소 - 168.126.63.1
보조 DNS 서버 주소 - 168.126.63.2
 
SK Broadband (브로드밴드), SK DNS
기본 DNS 서버 주소 - 210.220.163.82
보조 DNS 서버 주소 - 219.250.36.130
 
LG U+(유플러스; XPEED 파워콤), LG DNS
기본 DNS 서버 주소 - 164.124.107.9
보조 DNS 서버 주소 - 203.248.242.2
 
Google Public (구글 퍼블릭)
기본 DNS 서버 주소 - 8.8.8.8
보조 DNS 서버 주소 - 8.8.4.4



2. MySQL 의 skip-name-resolve. 기능을 이용하는 방법

- my.cnf 파일에 skip-name-resolve 를 추가하거나, MySQL 을 구동시킬때 skip-name-resolve 플래그를 추가한다.



3. Web 서버의 IP, Domain 을 hosts 에 추가하는 방법

- /etc/hosts 에 자신의 IP 와 Domain 을 추가한다.


ex)


# Do not remove the following line, or various programs

# that require network functionality will fail.

127.0.0.1       localhost        

::1             localhost6.localdomain6 localhost6


222.xxx.xxx.xxx  www.aaaa.com









공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함