2002년 3월 현재 노스모크는 많은 방문자수로 인해 서버과부하에 시달리는 경우가 많다. 노스모크의 속도를 개선하여 빠르고 쾌적한 노스모크항해방법을 모색해 본다.
editlog size 줄이기 ¶
editlog의 크기가 커지는 것을 막기 위해 cron을 이용해 주기적으로 editlog의 크기를 줄이는 방법을 씁니다. freefeel.org에 적용시킨 후 자세한 방법과 경과를 올리도록 하겠습니다.
설정
Profiling 결과 editlog의 크기는 큰 병목을 발생하지 않았습니다. 파일 개수가 커지는 문제가 더 컸습니다. 그리고 대부분의 웹호스팅 서비스는 cron을 불허하지 않나요? --김창준
파일개수가 커지는 문제가 곧 editlog의 크기문제입니다. 현재 모인모인의 구조적인 문제가 editlog에서 비롯됩니다. 개별파일의 history는 개별적으로 저장해야 하며, 전체의 global한 history파일은 RecentChanges만을 위해 최적화되어야 합니다. 일단 editlog의 크기를 줄이는 것만으로 간단히 속도를 높일 수 있습니다. 대신 개별 파일의 history를 제대로 남겨두지 못한다는 side-effect가 발생합니다.현재 모인모인은 editlog의 크기에 상관없이 os.listdir 시스템 콜을 통해 완전한 백업 리스트, 현재 페이지 리스트 등을 구합니다. --김창준
그리고 근본적으로 문제를 해결하려면, 널리 쓰이는 DBMS를 이용하거나 새로운 DBMS를 개발하여, file open/close/seek를 없애고, RecentChanges에 올라갈 데이터를 모두 memory에 caching해 주어야 합니다. 이렇게만 되면, 초당 20~30건 정도를 무난히 처리할 수 있게 됩니다. 잘만 튜닝하면 초당 100건 가까이 속도를 끌어올릴 수도 있습니다. ab를 이용해 같은 페이지를 반복적으로 호출할 때 초당 30건이 나오는 것은 OS의 disk cache 덕분으로, 실제 상황에는 적용되지 않는 숫자입니다. --Aragornos.listdir을 쓰는 것, 안 좋은 방법입니다. 속도를 빠르게 하려면 한 곳에 리스트를 모아서 관리해야 합니다. 수천~수만개의 파일목록을 얻어내는 것은 내부적으로 filesystem io가 꽤 많습니다. 개별 페이지의 history를 알아내는 것은 그것과 관련된 정보만을 얻어와야 효과적인데, 불필요하게 전체 파일목록을 os.listdir과 같은 무거운 system call을 쓰게 되니 속도가 느려지게 됩니다. --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)가 진행 예정입니다. 현재 네 명의 개발자를 모았습니다.