免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1249 | 回复: 0
打印 上一主题 下一主题

Pretuning Your Kernel SQUID [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-05-24 20:07 |只看该作者 |倒序浏览
Squid代理需要调整的一些参数
3.3 Pretuning Your Kernel
Squid requires a fair amount of
kernel resources under moderate and high loads. In particular, you may
need to configure your system with a higher-than-normal number of file
descriptors and mbuf clusters. The file-descriptor limit can be
especially annoying. You'd be better off to increase the limit before
compiling Squid.
At this point, you might be tempted to get the precompiled binaries to avoid the hassle of building a new kernel.
[1]
Unfortunately, you need to make a new kernel, regardless. Squid and the
kernel exchange information through data structures that must not
exceed the set file-descriptor limits. Squid checks these limits at
runtime and uses the safest (smallest) value. Thus, even if a
precompiled binary has higher file descriptors than the kernel, the
kernel value takes precedence.
[1] Not all operating systems require building a new kernel. Some may be tunable at runtime.
To change some settings, you must build and install
a new kernel. This procedure varies among different operating systems.
Consult Unix System Administration Handbook (Prentice Hall) or your operating-system documentation if necessary. If you're using Linux, you probably don't need to recompile your kernel.
3.3.1 File Descriptors
File descriptors are simply integers
that identify each file and socket that a process has opened. The first
opened file is 0, the second is 1, and so on. Unix operating systems
usually impose a limit on the number of file descriptors that each
process can open. Furthermore, Unix also normally has a systemwide
limit.
Because of the way Squid works, the file-descriptor
limits may adversely affect performance. When Squid uses up all the
available file descriptors, it is unable to accept new connections from
users. In other words, running out of file descriptors causes denial of
service. Squid can't accept new requests until some of the current
requests complete, and the corresponding files and sockets are closed.
Squid issues a warning when it detects a file-descriptor shortage.
You can save yourself some trouble by making sure the file descriptor limits are appropriate before running ./configure.
In most cases, 1024 file descriptors will be sufficient. Very busy
caches may require 4096 or more. When configuring file descriptor
limits, I recommend setting the systemwide limit to twice the
per-process limit.
You can usually discover your system's file-descriptor limit from your Unix shell. All C shells and similar have the built-in limit command. Newer Bourne shells and similar have a command called ulimit. To find your file-descriptor limits, try running these commands:
csh% limit descriptors unlimited
csh% limit descriptors
descriptors    4096
or:
sh$ ulimit -n unlimited
sh$ ulimit -n
4096
On FreeBSD, you can also use the sysctl command:
% sysctl -a | grep maxfiles
kern.maxfiles: 8192
kern.maxfilesperproc: 4096
If you can't figure out the file-descriptor limit, Squid's ./configure script can do it for you. When you run ./configure, as described in
Section 3.4
, watch for output like this near the end:
checking Maximum number of file descriptors we can open... 4096
If either limit, ulimit, or ./configure
report a value less than 1024, you should invest the time to increase
the limit before compiling Squid. Otherwise, Squid's performance will
be poor under a moderate load.
Increasing the file descriptor limit varies from
system to system. The following sections offer some tips to help get
you started.
3.3.1.1 FreeBSD, NetBSD, OpenBSD
Edit your kernel configuration file, and add a line like this:
options       MAXFILES=8192
On OpenBSD, use option instead of options. Then, configure, compile, and install the new kernel. Reboot your system so the change takes effect.
3.3.1.2 Linux
Configuring file descriptors on
Linux is a little complicated. You must edit one of the system include
files, and execute some shell commands before compiling and running
Squid. Start off by editing the file /usr/include/bits/types.h. Change the value for _ _FD_SETSIZE as follows:
#define _ _FD_SETSIZE    8192
Next, increase the kernel file descriptor limit with this command:
# echo 8192 > /proc/sys/fs/file-max
Finally, increase the process file-descriptor limit in the same shell in which you will configure and compile Squid:
sh# ulimit -Hn 8192
This command must be executed as root and only works from the bash shell. There is no need to reboot on Linux.
With this technique, you must execute the echo and ulimit commands each time your system boots, or at least before starting Squid. If you use an rc.d script to start Squid (see
Section 5.6.2
), that is a good place to stick these commands.
3.3.1.3 Solaris
Add this line to your /etc/system file:
set rlim_fd_max = 4096
Then, reboot the system for the change to take effect.
3.3.2 Mbuf Clusters
The BSD-based networking code uses a data structure known as an mbuf (see W.R.Stevens' book, TCP/IP Illustrated, Vol 2). Mbufs are typically small (e.g., 128 octets) chunks of memory. The data for larger network packets are stored in mbuf clusters.
The kernel may enforce an upper limit on the total number of mbuf
clusters available in the system. You can find this limit with the netstat command:
% netstat -m
196/6368/32768 mbufs in use (current/peak/max):
        146 mbufs allocated to data
        50 mbufs allocated to packet headers
103/6182/8192 mbuf clusters in use (current/peak/max)
13956 Kbytes allocated to network (56% of mb_map in use)
0 requests for memory denied
0 requests for memory delayed
0 calls to protocol drain routines
In this example, there are 8,192 mbuf clusters
available, but there are never more than 6,182 used at once. When the
system runs out of mbuf clusters, I/O routines such as read( ) and write( ) return the "No buffer space available" error message.
NetBSD and OpenBSD don't display mbuf usage in netstat -m output. Instead, they report "WARNING: mclpool limit reached" via syslog.
To increase the number of mbuf clusters, you need to add an option to your kernel configuration file:
options         NMBCLUSTERS=16384
3.3.3 Ephemeral Port Range
Ephemeral ports are the local port
numbers the TCP/IP stack assigns to outgoing connections. In other
words, when Squid makes a connection to an origin server, the kernel
assigns a port number to the local socket. These local port numbers
fall within a certain range. On FreeBSD, for example, the default
ephemeral port range is 1024-5000.
A shortage of ephemeral ports may adversely affect
performance for very busy proxies (i.e., hundreds of requests per
second). This is because some TCP connections enter a TIME_WAIT state
when they are closed. An ephemeral port number can't be reused while
the connection is in the TIME_WAIT state.
You can see how many connections are in this state with the netstat command:
% netstat -n | grep TIME_WAIT
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
tcp4       0      0  192.43.244.42.19583    212.67.202.80.80       TIME_WAIT
tcp4       0      0  192.43.244.42.19597    202.158.66.190.80      TIME_WAIT
tcp4       0      0  192.43.244.42.19600    207.99.19.230.80       TIME_WAIT
tcp4       0      0  192.43.244.42.19601    216.131.72.121.80      TIME_WAIT
tcp4       0      0  192.43.244.42.19602    209.61.183.115.80      TIME_WAIT
tcp4       0      0  192.43.244.42.3128     128.109.131.47.25666   TIME_WAIT
tcp4       0      0  192.43.244.42.3128     128.109.131.47.25795   TIME_WAIT
tcp4       0      0  192.43.244.42.3128     128.182.72.190.1488    TIME_WAIT
tcp4       0      0  192.43.244.42.3128     128.182.72.190.2194    TIME_WAIT
Note that this example has both client- and
server-side connections. Client-side connections have 3128 as the local
port number; server-side connections have 80 as the remote (foreign)
port number. The ephemeral port numbers appear under the Local Address
heading. In this example, they are in the 19,000s.
Unless you see thousands of ephemeral ports in the
TIME_WAIT state, you probably don't need to increase the range. On
FreeBSD, you can increase the range with this command:
# sysctl -w net.inet.ip.portrange.last=30000
On OpenBSD, the command is almost the same, but the sysctl variable has a different name:
# sysctl -w net.inet.ip.portlast=49151
On NetBSD, things work a little differently. The default range is 49,152-65,535. To increase the range, change the lower limit:
# sysctl -w net.inet.ip.anonportmin=10000
On Linux, simply write a pair of numbers to the following special file:
# echo "1024 40000" > /proc/sys/net/ipv4/ip_local_port_range
Don't forget to add these commands to your system startup scripts so that they take effect each time your machine reboots.


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/2389/showart_27564.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP