노스모크속도개선

FrontPage|FindPage|TitleIndex|RecentChanges| UserPreferences P RSS
2002년 3월 현재 노스모크는 많은 방문자수로 인해 서버과부하에 시달리는 경우가 많다. 노스모크의 속도를 개선하여 빠르고 쾌적한 노스모크항해방법을 모색해 본다.

editlog size 줄이기

editlog의 크기가 커지는 것을 막기 위해 cron을 이용해 주기적으로 editlog의 크기를 줄이는 방법을 씁니다. freefeel.org에 적용시킨 후 자세한 방법과 경과를 올리도록 하겠습니다.
Profiling 결과 editlog의 크기는 큰 병목을 발생하지 않았습니다. 파일 개수가 커지는 문제가 더 컸습니다. 그리고 대부분의 웹호스팅 서비스는 cron을 불허하지 않나요? --김창준
주기적으로 실시하는 스크립트가 존재했던 것 같은데, 그 스크립트에서 editlog도 같이 제거해 주면 cron 을 사용하지 않아도 될 것 같은데.. -- 환이

파일개수가 커지는 문제가 곧 editlog의 크기문제입니다. 현재 모인모인의 구조적인 문제가 editlog에서 비롯됩니다. 개별파일의 history는 개별적으로 저장해야 하며, 전체의 global한 history파일은 RecentChanges만을 위해 최적화되어야 합니다. 일단 editlog의 크기를 줄이는 것만으로 간단히 속도를 높일 수 있습니다. 대신 개별 파일의 history를 제대로 남겨두지 못한다는 side-effect가 발생합니다.
현재 모인모인은 editlog의 크기에 상관없이 os.listdir 시스템 콜을 통해 완전한 백업 리스트, 현재 페이지 리스트 등을 구합니다. --김창준
os.listdir을 쓰는 것, 안 좋은 방법입니다. 속도를 빠르게 하려면 한 곳에 리스트를 모아서 관리해야 합니다. 수천~수만개의 파일목록을 얻어내는 것은 내부적으로 filesystem io가 꽤 많습니다. 개별 페이지의 history를 알아내는 것은 그것과 관련된 정보만을 얻어와야 효과적인데, 불필요하게 전체 파일목록을 os.listdir과 같은 무거운 system call을 쓰게 되니 속도가 느려지게 됩니다. --Aragorn

그리고 근본적으로 문제를 해결하려면, 널리 쓰이는 DBMS를 이용하거나 새로운 DBMS를 개발하여, file open/close/seek를 없애고, RecentChanges에 올라갈 데이터를 모두 memory에 caching해 주어야 합니다. 이렇게만 되면, 초당 20~30건 정도를 무난히 처리할 수 있게 됩니다. 잘만 튜닝하면 초당 100건 가까이 속도를 끌어올릴 수도 있습니다. ab를 이용해 같은 페이지를 반복적으로 호출할 때 초당 30건이 나오는 것은 OS의 disk cache 덕분으로, 실제 상황에는 적용되지 않는 숫자입니다. --Aragorn
동의. DBMS 사용은 결국은 피할 수 없다고 봅니다. 웹계정 서비스를 사용하는 사람들을 위해 선택권을 줘야하겠지만. --김창준
{{|
설정
1) etc/logrotate.conf
logrotate를 이용하기 위해 conf파일을 설정한다. rotate 직후 tail - 600 ... 으로 이전 editlog의 마지막 600줄을 남겨둔다.

# see "man logrotate" for details
# uncomment this if you want your log files compressed
compress
delaycompress

/home6/Jimmy/WikiWiki/data/editlog {
  missingok
  daily
  rotate 30
  nocreate
  postrotate
    tail -600 /home6/Jimmy/WikiWiki/data/editlog.1 > /home6/Jimmy/WikiWiki/data/editlog
  endscript
}

2) crontab
새벽 5시 30분마다 한번씩 실행시켜준다. status파일을 따로 지정해야한다.

30  5 * * *  /usr/sbin/logrotate -s var/lib/logrotate.status etc/logrotate.conf

|}}


2002년 9월 현재 edit_log에 700여라인의 데이터가 기록되어 있으며, 항상 최근 600+ 정도의 편집기록만을 남겨둔다.

/usr/sbin/ab -n 50 -c 10 http://freefeel.org/wiki/RecentChanges
Requests per second:    2.01 [#/sec] (mean)
Time per request:       4984.40 [ms] (mean)
Time per request:       498.44 [ms] (mean, across all concurrent requests)
Transfer rate:          150.51 [Kbytes/sec] received

Connnection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0     4   10.1      0    34
Processing:  4161  4754  402.9   4692  5685
Waiting:     4161  4753  403.6   4692  5685
Total:       4161  4758  399.3   4692  5685

/usr/sbin/ab -n 50 -c 2 http://freefeel.org/wiki/RecentChanges
Requests per second:    2.21 [#/sec] (mean)
Time per request:       904.76 [ms] (mean)
Time per request:       452.38 [ms] (mean, across all concurrent requests)
Transfer rate:          164.35 [Kbytes/sec] received

Connnection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0     0    0.0      0     0
Processing:   807   904   93.6    871  1269
Waiting:      805   903   93.6    871  1269
Total:        807   904   93.6    871  1269
|}}

노스모크모인모인 100배 속도 향상 프로젝트(가제 YoriJori)가 진행 예정입니다. 현재 네 명의 개발자를 모았습니다.

"; if (isset($options[timer])) print $menu.$banner."
".$options[timer]->Write()."
"; else print $menu.$banner."
".$timer; ?> # # ?>