文件描述符(File Descriptor,简称FD)是计算机科学中一个重要概念,它在操作系统中表示已打开文件、套接字(socket)或其他类似资源的抽象指示符。文件描述符是一个整数,用于在进程中唯一标识一个已打开的文件或其他资源。
在Unix和类Unix系统(例如Linux)中,文件描述符被广泛使用。这些系统遵循“一切皆文件”的哲学,即不仅仅是磁盘上的文件,诸如管道、设备、网络连接等资源都可以用文件描述符来表示。在这些系统中,文件描述符是一个核心概念,用于实现低级别的文件和网络I/O操作。
文件描述符的使用主要涉及以下操作:
打开文件或资源:当打开一个文件或其他资源时,操作系统会分配一个唯一的文件描述符来表示该资源。
读取和写入:在读取或写入文件或资源时,需要使用文件描述符来告诉操作系统你要操作哪个资源。这样,操作系统就知道你要读取或写入哪个文件,从而执行相应的操作。
关闭文件或资源:当不再需要使用文件或其他资源时,需要关闭文件描述符,以便操作系统释放相关资源。
每个进程都有一组自己的文件描述符,它们在进程内部是唯一的。文件描述符的分配是从最小的可用数字开始的。通常,一个进程默认打开三个文件描述符:0(标准输入,stdin),1(标准输出,stdout)和2(标准错误,stderr)。
文件描述符的数量限制是为了防止系统资源被耗尽。每个打开的文件或其他资源都会消耗系统资源,如内存和内核数据结构。因此,限制每个用户或进程能够打开的文件描述符数量可以有效地防止资源耗尽。
在Oracle数据库中,类似于MySQL的open_files_limit参数的设置是通过操作系统文件描述符限制来实现的。在Linux系统中,这个限制由两个参数控制:系统级的fs.file-max和用户级的nofile。
1、系统级参数:fs.file-max
这个参数在/etc/sysctl.conf文件中设置,用来限制整个系统中能够打开的文件描述符数量。例如,要将系统级文件描述符数量限制设置为100000,可以在/etc/sysctl.conf文件中添加以下行:
fs.file-max = 100000
之后,运行以下命令使修改生效:
sudo sysctl -p
2、用户级参数:nofile
这个参数用来限制单个用户能够打开的文件描述符数量。可以通过修改/etc/security/limits.conf文件来设置。例如,要为oracle用户设置文件描述符数量限制为65536,可以在该文件中添加以下两行:
oracle soft nofile 65536
oracle hard nofile 65536
soft limit是警告级别的限制,而hard limit是实际限制。确保将上述设置中的“oracle”替换为实际的Oracle数据库用户。
注意:调整这些参数时,请确保根据系统资源和数据库需求进行合理设置。如果需要更多信息,请参阅Oracle官方文档以获取关于操作系统配置的建议。
下面结果用了几个文件描述符
通过lsof查询文件描述符得到下面结果
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ora_p00y_ 191439 oracle 256u REG 253,2 34359730176 4294970660 /data/oracle/TEST/datafile/o1_mf_undotbs1_kjmwqqbb_.dbf
ora_p00z_ 191441 oracle 256u REG 253,2 34359730176 4294970660 /data/oracle/TEST/datafile/o1_mf_undotbs1_kjmwqqbb_.dbf
ora_p010_ 191443 oracle 256u REG 253,2 34359730176 4294970660 /data/oracle/TEST/datafile/o1_mf_undotbs1_kjmwqqbb_.dbf
ora_p011_ 191445 oracle 256u REG 253,2 34359730176 4294970660 /data/oracle/TEST/datafile/o1_mf_undotbs1_kjmwqqbb_.dbf
ora_p012_ 191447 oracle 256u REG 253,2 34359730176 4294970660 /data/oracle/TEST/datafile/o1_mf_undotbs1_kjmwqqbb_.dbf
ora_p013_ 191449 oracle 256u REG 253,2 34359730176 4294970660 /data/oracle/TEST/datafile/o1_mf_undotbs1_kjmwqqbb_.dbf
在给出的lsof查询结果中,我们可以看到6个不同的进程(由PID区分)在使用文件描述符。
所有这些进程(ora_p00y_,ora_p00z_,ora_p010_,ora_p011_,ora_p012_ 和 ora_p013_)使用的文件描述符数(FD)均为256。虽然文件描述符的数值相同(256),但它们是在不同进程中的,因此它们指向的是各自进程中的同一个文件。所以这里使用了6个文件描述符。




