아파치가 시작될 때 모듈 내 함수가 처음에 한번만 실행되고 메모리를 공유하는 방법?

wono77의 이미지

안녕하세요.
아파치 모듈 개발 전문가님께 조언을 구합니다.

리눅스 환경에서, CentOS이며, 아파치 2.x대를 사용합니다.

웹에서 돌아가는 프로그램인데, 내부에서 c로 코딩한 so 파일을
아파치 모듈이 호출합니다.
그런데, 이 프로그램에서 100 메가 정도 되는 모델을 로드해야 합니다.
이 모델을 한번만 메모리에 로드하고 싶은데, 아파치로 올려보고 싶습니다.

이전에 비슷한 개발을 할 때는, shared memory를 이용해서 개발 후,
스크립트로 메모리를 올리고 내렸는데,
이 방법이 관리가 힘들어 아파치 모듈을 이용해 볼까 합니다.

아파치를 처음 시작할 때 메모리를 한번 올리고, 아파치를 내릴 때 메모리를 내리고,
아파치가 돌고 있는 동안에는 올린 메모리가 웹사용자들에게 공유가 되게 하고 싶습니다.

아파치 모듈을 통해 메모리를 한번만 올리면 모든 아파치 쓰레드가 메모리를 공유할 수 있을까 싶어,
아파치 모듈을 만들어 페이지를 웹에서 호출한 후, 테스트를 한번 해보았는데,
modelTest라는 메모리를 static으로 생성해서 웹페이지를 호출 후,
전체 아파치 스레드들이 이 값을 공유하는지 보았습니다.

아래처럼 테스트 모듈을 만들었습니다.(코드의 일부분)

static int* modelTest=NULL;

int handler(request_rec *ptReq)
{
if(modelTest==NULL)
{
modelTest=(int*)calloc(1000,sizeof(int));
ap_rputs("do malloc\n",ptReq);
ap_rprintf(ptReq,"mallocCount: %d\n",mallocCount);
}
else
{
ap_rputs("already..\n",ptReq);
}
ap_rprintf(ptReq,"%d",modelTest);
}

그랬더니, 아파치가 처음 생성하는 httpd 갯수가 httpd.conf에서 만약에 3개로 설정되어 있다면,
3개까지(httpd1,2,3 순서대로)는 무조건 한번씩 malloc을 하고나서,
그다음부터 메모리 공유를 하네요.

apache- httpd1
- httpd2
- httpd3

그러니까, 만약에 httpd를 처음에 16개정도 생성하게 설정해뒀다면,
16개 * 100M(기본 모델 메모리)=1.6기가 해서, 총 1.6기가의 메모리를 올리고 시작하게 되는 엄청난 재앙이;;.

그래서 고민고민하다가 여쭈어봅니다.

특정 모듈의 함수가 아파치가 시작될 때 처음에 한번만 실행되게 하고,
그 때, 할당된 메모리를 httpd 전체 프로세스가 공유하게 하는 그런 방법은 없을까요?


김정균의 이미지

님이 하시는 것은 메모리를 공유하는 것이 아니라 메모리를 할당 하는 것입니다. 공유 메모리를 사용하시려면 shm 같은 것을 찾아 보시기 바랍니다.

man shm_open 정도를 참조해 보시면 될 것 같군요. 물론 apache 가 fork 모델일 경우에는 각 프로세스 마다 shm_open을 할 테니 데이터가 있는지 없는지 확인하는 루틴이 필요할 수 있을 겁니다. 아니면, module hook을 잘 살펴 보시면, fork전에 처리하는 부분을 찾을 수도 있을 겁니다.

송효진의 이미지

그 모델이라는 것의 데이터 형식을 알려주시면 괜찮은 방법을 제시해 드릴 분이 있을것 같습니다.
DB 형식이면 MySQL 의 Heap 타입의 테이블도 괜찮죠.

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇개 안되요~
http://xenosi.de/

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.