위키의기술적인한계

FrontPage|FindPage|TitleIndex|RecentChanges| UserPreferences P RSS
모인모인, TWiki의 주로 Scalability와 관련된 기술적인 한계

검색기능이 grep에 의존하고 있어서 글수가 많아질수록 검색속도 저하

대략 글수가 1~2만개를 넘어가기 시작하면 반응속도가 4~5초를 넘어가기 시작하게 되고, 위키와 같이 검색이 잦은 시스템은 서버부하가 급격히 증가하게 된다.

해결책
  1. 전문(全文) 색인, 무료 검색 엔진 도입
    • 사람이 글을 찾기 위해서 검색하는 것이 아니라 위키 내부에서 기능을 구현하기 위해 검색하는 경우가 많아서 전체 구조를 개선하기 전에는 검색시스템을 도입하기는 어렵다.
    • 한글검색 잘 되는 무료검색엔진은 드물고, 연동하기가 어렵다.
  2. 내부적 검색을 가능한한 link검색 위주로 바꾼다. 현재 모인모인의 link검색은 indexing을 이용하여 구현되어 있다.

파일시스템에 개별적으로 글을 저장하기 때문에 2대 이상의 서버에 부하 분산이 용이하지 않음

웹서버+애플리케이션서버+DB서버 와 같은 3Tier구조를 갖기도 어렵고, 데이터를 여러 서버에 분산하여 저장하기도 어렵다.

해결책
  1. RDBMS 사용으로 해결이 가능하다.
    • DBMS를 사용하면서 RCS를 쓰기 어렵다. DB에 데이터를 저장하게 되면 RCS와 유사한 별도의 버전관리시스템을 구현해야 한다.
  2. CGI 사용에 따른 부하는 비동기 서버(e.g. medusa)로 혹은 cgi 모듈로 해소한다.
    • CGI방식이기 때문에 느린 것은 mod_perl 등의 방법이나 FastCgi등을 이용해 해결할 수 있으나, 이렇게 하더라도 CPU 1~2개의 서버에서 하루에 10~20만 pageview를 처리하는 것이 한계이다.
  3. 모인모인의 Standalone 서버모드를 활용한다. 파이썬의 기본 SocketServer의 상속이기 때문에 한계가 금방 드러나지만, 이 문제는 [http]CoolWater이나 [http]TwistedPython에서 바인드 후 포킹하는 구조의 프레임웍을 구현했기 때문에 이것으로 바꾸면 그다지 어렵지 않다. 이 기능을 이용하여 CGI 포킹에 따른 과부하 문제를 해결할 수 있다.
{{|
비동기서버와 서버의 부하감소

비동기서버는 싱글 프로세스 멀티플렉싱 서버를 가리키는 것이다. 비동기서버는 하나의 프로세스에서 다수의 네트워크 커넥션을 맺고, non-blocking system call을 이용하여 데이터를 주고 받는 방식으로, C10K문제를 해결하는 한가지 방법이다. (see also http://www.nightmare.com/medusa/)

현재 교과서에서 이야기되는 asynchronous system call을 제공하는 OS가 거의 없으며, 대부분의 비동기서버는 non-blocking socket과 select(2)를 이용하여 구현되어 있다(medusa포함).

C10K문제는 static file을 제공하는 경우나 proxy server의 경우의 문제이고, 위키위키와 같은 무거운 애플리케이션은 CPU가 고갈되는 것과 Disk IO가 많아지는 것이 문제이기 때문에 하드웨어 수를 늘이는 것이 유일한 해결책이다. 현재 노스모크서버의 부하상태와 노스모크의 규모로 볼 때, 일반적인 PC서버에서 노스모크 규모의 위키위키커뮤니티를 두셋 이상 수용하는 것은 어렵다.
|}}

NameSpace가 부족

TWiki의 경우 Web이라는 상위분류를 통해 문제를 해결하고 있고, 모인모인의 경우 제목에 접두어,접미어를 추가하여 문제를 해결할 수 있다. see also HierarchicalWiki

그러나

NameSpace 부족을 해결하려는 시도 자체가 오히려 더 큰 문제를 만들어낼 수 있다. see also 위키키워드토론, 페이지이름

하나의 글을 동시에 여러명이 수정하는 충돌문제에 취약

서로 다른 부분을 수정한 경우 위키가 자동으로 취합해줄 수 있고, 같은 부분을 수정한 경우 정확히 그 부분이 어느 곳인지 알려줄 수 있으나 현재는 기능이 구현되어 있지 않다.

해결책
  1. 퍼키가 libcvs를 이용하여 자동취합, 충돌판별 기능을 구현하였다.
    • libcvs를 파이썬으로 바인딩해서 모인모인이 파일DB를 쓰지 않고 CVS를 DB로 쓰도록 고치려고 했는데, libcvs바인딩은 거의 다 되었지만 그 이후로 큰 진전이 없다.
    • CVS를 직접 사용하면 아무래도 히스토리가 방대해지는 문제와 자동취합문제가 해결된다.
    • [http]annotate라는 요즘 아주 유행하는 CVS기능을 참고할만하다.


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