ソケット、テキストファイル、db、フラッシュなど、すべてがLinuxプログラミングのファイルであるため、特にネットワークプログラミングのサーバー側のソケットでは、3つのハンドシェイクの後、ソケットの処理を忘れることが多く、最終的にはプロセス全体のファイル記述子の消費につながります。 Linuxの書き込みプログラムでは、fdが状況を閉じるのを忘れることが多いため、ファイル記述子の枯渇も発生します。次の方法は、ファイル記述子が閉じるのを忘れたかどうかを確認するのに役立ちます。
1)Linuxシステムでは、すべてのプロセスで開くことができるFDの最大数。クエリステートメント:
/ proc / sys / fs / file-max
2)Linuxシステムでは、すべてのプロセスによって開かれたfdsの数と許可される最大数。クエリステートメント:
[root @ localhost logs]#cat / proc / sys / fs / file-nr
2112 | 0 | 2100000 |
割り当てられたファイルハンドルの数 | 使用されるファイルハンドルの数 | ファイルハンドルの最大数 |
割り当てられたファイルハンドルの数:ファイル記述子を閉じるのを忘れた場合、この値は増加し続けるため、ストレステストを行う場合はこの状況に特に注意してください。
C言語を使用して取得する
#include <stdio.h>
typedef struct
{
unsigned int assigned;/*已分配文件句柄的数目 */
unsigned int used;/*文件句柄的最大数目*/
unsigned int total;/*文件句柄的最大数目*/
}system_info_fd_t;
static void ptcp_server_get_sys_fd_info(system_info_fd_t *info_fd)
{
FILE *fd;
char buff[256];
fd = fopen ("/proc/sys/fs/file-nr", "r");
fgets (buff, sizeof(buff), fd);
sscanf (buff, "%u %u %u", &info_fd->assigned, &info_fd->used,&info_fd->total);
fclose(fd);
}
3)1つのプロセスで開くことができるFDの最大数クエリステートメント:
ulimit -n
4)単一のプロセス(たとえば、対象のプロセスIDが655であることを確認するためにps -auxを使用)がfdに開かれています。クエリステートメント:
ls -l / proc / 655 / fd / | wc -lを実行すると、fdが増加し続けることがわかり、プロセスがファイルの説明を閉じるのを忘れたことを確認できます。