2

snmplibのsnmp_synch_response()からの膨大な数のメッセージが約3時間以内に60GBのハードドライブをいっぱいにすることに成功しているという奇妙な問題に遭遇しました。メッセージはすべて「大きなファイル記述子を処理するためにsnmp_sess_select_info2()を使用してください」であり、1行に100回以上繰り返されることもあります。私はまだお客様と一緒にこれを社内で再現する方法を模索していますが、それが古い問題であるか、少なくとも他の誰かに何らかの形で見られた場合に備えて、ここで質問したいと思いました。

基本的なシステム情報は次のとおりです。8.1-RELEASE-p2FreeBSDi386。NET-SNMPのバージョンは5.5です。

以下は、私のコードの重要な部分の簡略化されたスニペットです。コードは最初に、初期化されているが開いていないセッションでタスクのリストを作成します。他の場所では、小さな制限(この場合は64)までの各タスクがフォークされ、子はsnmp_open()などでSNMPセッションソケットを開きます。set()、get()、getnext()のそれぞれを精査し、それらがすべてsnmp_close()を適切に呼び出すことを確認しました—これらの呼び出しを早期に返すことや他のジャンプはありません—したがって、私はしませんソケットを明示的にリークしていると思いますが、何らかの理由で記述子がぶら下がっている必要があります。これは誰かのために何か鐘を鳴らしますか?

for(…){
    …
    snmp_sess_init(&task->sess_info);
    addtask(taskList, task);
    …
}

…

for(task = taskList; task && nkids < maxkids; task = task->next){
    if(fork() == 0){
        set(task);
        get(task);
        getnext(task);
        …
    }
    nkids++;
}

void set(Task *task){
    …
    sess = snmp_open(&task->sess_info);
    …
    pdu = snmp_pdu_create(SNMP_MSG_SET);
    …
    status = snmp_synch_response(sess, pdu, &resp);
    // check return, retr
    snmp_close(sess);
}

void get(Task *task){
    …
    sess = snmp_open(sess_info);
    …
    pdu = snmp_pdu_create(SNMP_MSG_GET);
    …
    status = snmp_synch_response(sess, pdu, &resp);
    // check return, read variables
    snmp_close(sess);
}

void getnext(Task *task){
    …
    sess = snmp_open(sess_info);
    for(obj = task->objs; obj; obj = obj->next){
        …
        pdu = snmp_pdu_create(SNMP_MSG_GET);
        …
        status = snmp_synch_response(sess, pdu, &resp);
        // check return, read variables
    }
    snmp_close(sess);
}
4

2 に答える 2

2

誰かがなんとか似たようなことに遭遇した場合、これは(当然のことながら)net-snmpとは何の関係もありませんでした。各子プロセスは、独自のソケットを介して親に通信します。fork()の基本的な性質により、親のソケットのリストは各子にコピーされていました。解決策は、子コードでこのリストのソケットを閉じることでした。

于 2012-05-16T03:12:58.193 に答える
1

ここで同じエラーメッセージをグーグルで検索してしまう可能性がある人のために。私のコードの問題は、古いセッションが適切に閉じられていないときに新しいセッションを作成することでした(snmp_closeが失敗する可能性があり、これをチェックしませんでした)新しいセッションでこのエラーをスローする可能性があります。

snmp_close_sessions()を使用してこれを解決しました。

于 2017-12-29T17:56:41.860 に答える