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);
}