오픈 소스 프로젝트 - XE 개발 포럼
PHP에서 기본적으로 제공하는 session function을 이용하여 php설정에 따라 세션이 저장되는 위치만 변경하고 있습니다.
그런데 아시다시피 이럴 경우 접속자가 조금만 증가되어도 수 많은 garbage 파일들이 생성되고 또 한 디렉토리내에 수만에서 수십만 이사으이 파일들이 생성되어 시스템 측면에서도 좋지 않은 결과를 불러오고 있습니다.
또 현재는 지원되고 있지 않지만 한대 이상의 웹서버를 구축할때 세션 정보를 공유할 수 없다는 단점도 있습니다.
하지만 php에서 자체 제공하는 기능이라 안정적이고 손쉽게 사용가능하다는 장점이 있습니다.
이에 반해 세션정보를 db를 이용하는 방법도 있습니다.
zbXE의 경우 기본적으로 모든 요청시 db에 접속을 하고 또 인증된 사용자의 경우 무조건 해당 회원의 DB에 저장된 정보를 읽어오도록 하기 때문에 db query가 한번 더 늘어나는 것에 대해서 큰 부담은 없다고 판단합니다.
더군다나 session handler를 자체적으로 생성하여 사용할 경우 세션 정보의 수정 및 관리가 수월해지고 불필요한 garbage파일들이 생성되지 않게 할 수 있습니다.
현재 제로보드 공식사이트의 경우 20만여개의 세션 관련 파일들이 한 디렉토리내에 존재하고 있습니다.
그리고 zbXE의 경우 쪽지 유무등에 대해서도 모두 flag file을 이용하여 처리하고 있는데 이들을 모두 세션 테이블에 저장할 수가 있게 됩니다.
zb5beta때 db로 세션 핸들링을 하였는데 그때에도 db 부하가 늘어난다든지 하는 경우는 없었던 것 같습니다.
zbXE 오픈 이후 세션 관련 문제들을 계속 보고 있는데 아무래도 웹서버의 자원을 많이 활용하는 zbXE의 구조상 session정보등을 DB를 이용하는 것이 더 좋을 것 같다고 생각하고 있습니다.
이와 관련되어서 좋은 의견 주시면 감사하겠습니다.
좋은 생각인 것 같습니다만, 개인적으로 걱정되는 것은 기본적인 table engine의 구조적 한계에 의해 DB에 delete 쿼리를 날려도 그것이 남아있어 용량 부담을 가중시킬 것이란 점입니다. zb5를 이용할 때 항상 문제이기도 했고요. optimize table 쿼리도 데이터 양이 많으면 만만치 않은 부담이 됩니다.
MySQL에서는 MEMORY라는 storage engine이 있지만 타 DB에서 모두 있으리라는 보장은 없기에, 이 부분은 항상 문제가 될 것 같습니다.
네
전 DB가더 효율적인것같아요.
제경험담은 검색이라는걸 할때에 검색결과를
지정디렉터리에 저장합니다. 그래서 하루만지나도 파일이 수백개가 넘지요
이게 효율적이지 못하다는걸 깨달았습니다.
DB로 관리하고 관리자가 삭제가가능한 그런 시스템이 마련되면 좋겠네요.
만약 파일로한다면 가끔씩 세션비우는것도 해줘야 하겠네요?...
HNO3님께서 말씀하신 것처럼 잦은 insert/delete 때문에 테이블 옵티마이즈 시키는 부분이 문제이기는 하지만, 이 부분은 관리자가 로그인할 때 한번씩 해줄 수 있도록 함으로 어느 정도 해결할 수 있지 않을까 싶습니다. 자동으로 해도 큰 무리는 없을 듯 싶고, 아니면 테터툴즈처럼 DB 관리툴을 관리용 모듈로 제공하는 것도 괜찮을 것 같습니다.
다만
postgreSQL은 C도 트리거로 쓸수 있어서 DB를 LookUp하는데 좋은데 Mysql은 5부터 트리거 쓸수 있군요 -_-;;
개인적인 생각으로는..DB만 이용하는 것은 어쩔수 없이 시스템 자원을 많이 쓸 수 밖에 없다고 생각합니다.
MiddleWare가 없는한..
그리고 쿠키스니핑은 1차적으로 MD5를 이용하여서 encrypt + decrypt 모듈을 만들면 어느정도 보완할수 있습니다.
예를 들자면 이런식으로요
MD5: 32자리
1. 32자리를 64자리로 늘려서 사이에 일정한 규칙을 가지고 멤버키나 이런것들을 집어넣는다.
2. DB에도 생성이 되도록 해서, DB에 트리거를 건다. 트리거는 insert시 동작되며 일정시간이 지난 키들은 삭제되도록 한다..
이런식은 어떨런지요?
여섯시간마다 Crontab 돌려서 세션 삭제 직후 Optimize까지 동시에 해주면 되니 delete에 대한 자원 소모는 적을 듯합니다.
update야 session wirte 때 항상 일어나니 어쩔수 없죠.
지금 세션을 DB로 사용하는데 예전이나 지금이나 똑같습니다.
세션 정보는 PHP 소스를 보고 따라해봐도 좋을것 같네요. 저도 아직 못 들여다봐서..ㅡㅡ;
또한, 세션DB같은 경우 말씀하신데로 한번 쓰고 마는 데이타 입니다. 그래서 Insert/Delete가 자주 발생하게 되겠죠.
하지만, PHP 파일 형태대로 라면 Delete는 안일어나도 될것 같습니다.
그냥 멤버 테이블에 세션 필드 하나 추가해서 그 멤버에대한 세션관리만 해도 될것 같네요. 즉, Update만 일어나는것이죠.
아마 큰 부하는 안걸릴것 같습니다. 오히려 파일시스템을 이용하는것이 더 큰 부하를 줄것 같네요 ^^;
따라서, 제로보드의 가장 큰 약점인 속도 문제는 세션을 메모리에 저장하는 것에서부터 시작해야 할 것으로 생각됩니다.
DB 역시 디스크에 저장되는 것이 기본이니까요.
다행히 세션은 작은 파일들이라 1백만개가 되더라도 50MB면 충분할테고, 메모리 100MB 정도 할당해서 충분한 속도향상을
얻을 수 있다면 싫어할 서버관리자는 없을 것 같은데요. 제가 모르는 다른 문제가 있을 것 같긴 하지만....흠
메모리 가상디스크를 제로보드에서 채택하긴 힘들까요? 자동화가 안되어서 힘들수도 있단 생각이 들긴 합니다만,
공개된 리눅/유닉/윈도용 메모리 가상 디스크 프로그램은 많이들 있으니까 함께 배포 및 자동설정만 잡아준다면
가능할수도 있을꺼 같단 생각이 드네요.
전 시스템 S/W 개발자라 아무래도 시스템 유틸과의 연동쪽으로 생각해보게 되는군요.
고민 많이 하시고~ 좋은 결과 나오길 부탁드리겠습니다. ^^
ZBXE는 php 프로그램으로, core module과 class들은 추가 설치 프로그램 없이 어느 서버 플랫폼(php 4.4 이상의)에서나 동작할 수 있도록 만들어져야 합니다.
아무래도 core에서 OS 종속적인 외부 바이너리 프로그램을 사용하여 최적화를 시키는 것은 힘들 것입니다. 그런 것은 차라리 dynamic trigger 완성 후 따로 addon으로 배포하는 쪽으로 생각해 보아야 할 것 같습니다.
아, 써놓고 생각난 것인데 session을 관리하는 여러 방법(DB, memory pool, etc.)을 addon으로 구현하여 사용자가 어느 하나를 선택하게 하는 것은 어떨까요.
리눅의 ext2fs든 윈도의 ntfs든 모두 공간이 모자라면 확장이 됩니다. 문제는 디렉토리인 경우죠. 즉 세션디렉과 같이 많은 파일이 존재하는 경우, inode@ext2fs나 FILE record@ntfs 모두 많은 블럭들이 확장 연결되면서 결국 디렉토리 공간에 대한 조각현상이 심각해지므로 단순 fopen/fclose에도 현저하게 속도가 저하됩니다. 디스크의 가장 큰 약점인 시크타임은 디스크 조각이 많이 나면 죽음이지요.
역시나 결론은 메모리에 저장하는 것입니다. 뭐 ssd가 대중화되면 몰라도.. 현재로서는 ZBXE 자체에서 해결해야겠지요.
한 가지 확실한 것은, php에서 기본적으로 memory pool을 이용할 방법이 없다는 것입니다.
그렇기에 바이너리 프로그램과 연동되어야 하는데, zbxe core에 이 기능을 집어넣을 수는 없습니다. 이 글처럼 애드온으로 만들어야만 합니다.
사실, 바이너리와의 지속적인 연관이 가능한 지도 잘 모르겠습니다. 한 번의 php call에 한 번 이상의 process call을 하여야 하는데, 이 부분에 대해 system이 느려지거나 불안정해지지는 않을까 걱정입니다.
http://php.mirror.camelnetwork.com/manual/kr/ref.sem.php
다만 윈도우즈에서는 동작하지 않고 또 동기화의 어려움이 있긴 합니다.
HNO3님의 말씀처럼 core code에 공유 메모리등을 사용하도록 할 수는 없을 것 같구요 파일, DB 또는 기타 자원을 사용할 수 있도록 확장할 수 있는 구조로 개발해야 할 것 같네요.
아직 다른 부분 개발하느라 세션 쪽은 설계도 못하고 있습니다. ^^;;;;






^^ 성능 향상을 위해선 당연한 선택이지 않을까 생각되네요.
슬적 웹서핑하니.. jsession이란 넘이 존재하긴 했는데...
현재는 만들었던 회사 홈피에선 찾을수가 없네요.