3

昨日、ヒープの割り当てと解放の数が増え続けているのはなぜだろうと思っていました

今日、犯人を見つけましたが、その理由がわかりません:

openlog ("XYSV", LOG_PID, LOG_SYSLOG);
syslog (LOG_NOTICE, "server started by %s(%d) on port %d", getenv("USER"),getuid (),servPort);
closelog();

for (;;) /* Run forever */
{
    clntSock = AcceptTCPConnection(servSock);
    char ipstr[INET6_ADDRSTRLEN];

    /* Fork child process and report any errors */
    if ((processID = fork()) < 0)
        DieWithError("fork() failed");
    else if (processID == 0)  /* If this is the child process */
    {
        close(servSock);   /* Child closes parent socket */
        HandleTCPClient(clntSock);

        exit(0);           /* Child process terminates */
    }

    openlog ("XYSV", LOG_PID, LOG_SYSLOG);
    //syslog(LOG_INFO,"%d : created new child process for connect from %s\n", (int) processID,ipstr);
    //syslog(LOG_INFO, "test");
    closelog();

    close(clntSock);       /* Parent closes child socket descriptor */
    childProcCount++;      /* Increment number of outstanding child processes */    
}

2 つの syslog エントリのコメントを外すとすぐに、ヒープの割り当て (Valgrind によって報告) が増加し続けます。割り当ても解放されますが、割り当ての総数が増加し続けるため、割り当てられたメモリのサイズが増加します。IMHOこれにより、遅かれ早かれサーバーのメモリが不足します。

私の質問は、syslog への書き込みによって割り当てが増加する理由です。うまくsyslogを閉じています。最初の syslog は、ヒープ割り当てには影響しません。syslog への 2 回目の書き込みのためにオープンとクローズをそのままにして、実際の書き込みをコメントアウトしたままにすると、すべて問題ありません。1 つまたは 2 つの syslog 行のコメントを外すとすぐに、割り当てが忍び寄り始めます。

私は明らかな何かを監視しているに違いありません。

4

1 に答える 1

1

syslogメッセージがローカルバッファよりも大きい場合、呼び出しはログメッセージを配信する前にログメッセージを保持するためのメモリを割り当てます。

FILE *実際には、の呼び出しによって作成されたに書き込みますopen_memstream。これは、必要に応じて自動的に拡張されるバッファーを実際に使用するCファイルストリームです。次に、バッファを取得し、その内容をロガーに送信します。

ソースはこちらです。

于 2012-07-31T09:43:36.357 に答える