编译squid之文件描述符

简介: 文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。Unix操作系统通常给每个进程能打开的文件数量强加一个限制。更甚的是,unix通常有一个系统级的限制。 因为squid的工作方式,文件描述符的限制可能会极大的影响性能。当squid用完所有的文件描述符后,它不能接收用户新的连接。也就是说,用完文件描述符导致拒绝服务。直到

文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。Unix操作系统通常给每个进程能打开的文件数量强加一个限制。更甚的是,unix通常有一个系统级的限制。

因为squid的工作方式,文件描述符的限制可能会极大的影响性能。当squid用完所有的文件描述符后,它不能接收用户新的连接。也就是说,用完文件描述符导致拒绝服务。直到一部分当前请求完成,相应的文件和socket被关闭,squid不能接收新请求。当squid发现文件描述符短缺时,它会发布警告。

在运行./configure之前,检查你的系统的文件描述符限制是否合适,能给你避免一些麻烦。大多数情况下,1024个文件描述符足够了。非常忙的cache可能需要4096或更多。在配置文件描述符限制时,推荐设置系统级限制的数量为每个进程限制的2倍。

通常在Unix shell中能找到系统的文件描述符限制。所有的C shell及其类似的shell有内建的limit命令。Bourne   shell及其类似的shell有一条叫做ulimit的命令。为了发现你的系统的文件描述符限制,试运行如下命令:

shell> ulimit -n

1024

 

如果你不能确认文件描述符限制,squid的./configure脚本能替你做到。当你运行./configure时,观察末尾这样的输出:

checking Maximum number of file descriptors we can open... 1024

假如其他的limit,ulimit,或者./configure报告这个值少于1024,你不得不在编译squid之前,花费时间来增加这个限制值的大小。否则,squid在高负载时执行性能将很低。

 

 

在编译squid之前,你必须编辑系统include文件中的一个,然后执行一些shell命令。

1.首先编辑/usr/include/bits/typesizes.h文件,改变 __FD_SETSIZE 的值:

#define   __FD_SETSIZE            1024

2.使用这个命令增加内核文件描述符的限制:

echo big-number > /proc/sys/fs/file-max     ///big-number是个大数字

3.增加进程文件描述符的限制,在你即将编译squid的同一个shell里执行:

ulimit -Hn 4096

该命令必须以root运行,仅仅运行在bash shell。不必重启机器。使用这个技术,你必须在每一次系统启动后执行上述echo和ulimit命令,或者至少在squid启动之前。假如你使用某个rc.d脚本来启动squid,那是一个放置这些命令的好地方。

关于limits.conf配置,可以详见笔者以前做的小实验,可以发现某些区别!

另外,如果想了解更多相关ulimit的使用,可以查看kumu博客对ulimit对nproc的限制的研究!

 

最后,修改了文件描述符,如果想根据业务的要求,在编译squid的时候,最新版squid-3.2.5中有如此选项“--with-filedescriptors=NUMBER”,强制squid支持更多的文件描述符!

另外,如果不加此编译选项,也可以编辑squid源码包include中的头文件,修改autoconf.h里面对DEFAULT_FD_SETSIZE的宏定义!squid-3.2.5设置的是1024!

 

目录
相关文章
|
存储 Shell Linux
Linux--文件(2)-重定向和文件缓冲
Linux--文件(2)-重定向和文件缓冲
|
7月前
|
Linux
Linux中查看端口被哪个进程占用、进程调用的配置文件、目录等
Linux中查看端口被哪个进程占用、进程调用的配置文件、目录等
113 0
|
11月前
|
Linux 开发工具 索引
Linux重定向文件描述符FD
我们知道在Linux系统中的一切都可以被视为文件,文件可以分为:普通文件、目录文件、链接文件和设备文件。在操作这些所谓的文件时,我们每次都会找到一个名字,这需要很多时间和效率。Linux规定每个文件对应一个索引,以便在操作文件时,我们可以直接找到索引进行操作。 文件描述符(file descriptor)为了有效地管理这些已经打开的文件创建的索引,它是一个非负整数(通常是小整数),用于指代打开的文件,所有执行I/O操作系统的呼叫是通过文件描述符实现的。同时,还规定,当系统刚刚启动时,0是标准输入,1是标准输出,2是标准错误。
73 0
|
Linux C语言 C++
【Linux】文件操作、文件描述符和重定向(上)
【Linux】文件操作、文件描述符和重定向(上)
【Linux】文件操作、文件描述符和重定向(上)
|
Linux C语言
【Linux】文件操作、文件描述符和重定向(下)
【Linux】文件操作、文件描述符和重定向(下)
【Linux】文件操作、文件描述符和重定向(下)
|
Linux PHP
php进程通信-PIPE管道通信
php进程通信-PIPE管道通信
103 0
php进程通信-PIPE管道通信
|
PHP
php proc_open子进程无法请求网络
php proc_open子进程无法请求网络
73 0
|
Linux
12.6 Linux列出进程调用或打开的文件信息(lsof命令)
我们知道,通过 ps 命令可以查询到系统中所有的进程,那么,是否可以进一步知道这个进程到底在调用哪些文件吗?当然可以,使用 lsof 命令即可。
288 0
12.6 Linux列出进程调用或打开的文件信息(lsof命令)
|
Linux
linux下两个进程可以同时打开同一个文件吗?返回的文件描述符一样吗?
linux下两个进程可以同时打开同一个文件吗?返回的文件描述符一样吗? 一:结论 1.两个进程中分别产生生成两个独立的fd 2.两个进程可以任意对文件进行读写操作,操作系统并不保证写的原子性 3.进程可以通过系统调用对文件加锁,从而实现对文件内容的保护 4. 任何一个进程删除该文件时,另外一个进程不会立即出现读写失败 5.两个进程可以分别读取文件的不同部分而不会相互影响 6.一个进程对文件长度和内容的修改另外一个进程可以立即感知   二:文件描述符与打开文件的关系? 内核中,对应于每个进程都有一个文件描述符表,表示这个进程打开的所有文件。
2827 0