让linux支持50万用户

To support over 500k users, you *need*

- A 64 bits hardware/kernel (AMD64, Opterons)
- At least 8GB of ram
- A recent linux kernel (2.6.x)

About tuning, I prefer to not fully disclose them because servers are targets of many attacks, so it's better not help hackers.

The most touchy thing is the IP route cache : You have to tune it or else the machine drops many connections

(hint : rhash_entries=... in the boot append string)
hints :
echo 1 > /proc/sys/net/ipv4/route/gc_interval

内定值是60,数值越小cache释放的速度会越快
意思是说:cache会记录连线当时的资讯,如gateway
如果断线的当时, cache纪录的gateway依然是断掉连线的那一条线路的gateway,
而且cache的reflush时间又还那么长,那就会产生连线失效的状况
因此把数值调低素素看吧
echo 150 >/proc/sys/net/ipv4/route/gc_timeout
刷新路由缓冲的延迟
echo 2 >/proc/sys/net/ipv4/route/gc_elasticity
刷新路由缓冲的延迟

- Use of hugeTLB pages
hint :
echo xxx >/proc/sys/vm/nr_hugepages
设定的大小是以页(page)的数量为单位的。 xxx=64;200;1536 .

Tune tcp :
echo "4096 49152 131072" >/proc/sys/net/ipv4/tcp_wmem
为自动调优定义每个socket使用的内存。第一个值是为socket的发送缓冲区分配的最少字节数。第二个值是默认值(该值会被wmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值。第三个值是发送缓冲区空间的最大字节数(该值会被wmem_max覆盖)。
  
echo xxxx >/proc/sys/net/ipv4/tcp_max_syn_backlog
记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。如果服务器不堪重负,试试提高这个值。注意!如果你设置这个值大于1024,最好同时调整include/net/tcp.h中的TCP_SYNQ_HSIZE,以保证TCP_SYNQ_HSIZE*16 ≤tcp_max_syn_backlog

echo xxxx >/proc/sys/net/core/somaxconn
echo 1024 > /proc/sys/net/core/somaxconn
默认值是128
这个值不能调高系统的最大连接数,但是能调高系统同事发起连接的tcp连接数
如果是由于系统网络并发联机数过多导致连接不上,那么调整这个数值应该有效。

echo 1200000 > /proc/sys/net/ipv4/tcp_max_tw_buckets
系统同时保持timewait套接字的最大数量。如果超过这个数字,time-wait套接字将立刻被清除并打印警告信息。

echo 7 >/proc/sys/net/ipv4/tcp_retries2
在杀死一个活动的TCP连接之前重试多少次。 RFC 1122规定这个限制应该长于100秒。这个值太小了。缺省值是15,相当于13~30分钟

echo "600000 650000 700000" >/proc/sys/net/ipv4/tcp_mem
确定TCP栈应该如何反映内存使用;每个值的单位都是内存页(通常是4KB)。第一个值是内存使用的下限。第二个值是内存压力模式开始对缓冲区使用应用压力的上限。第三个值是内存上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的BDP可以增大这些值(但是要记住,其单位是内存页,而不是字节)。

echo 0 >/proc/sys/net/ipv4/tcp_timestamps
以一种比重发超时更精确的方法(请参阅RFC 1323)来启用对RTT的计算;为了实现更好的性能应该启用这个选项。
  
echo 0 >/proc/sys/net/ipv4/tcp_window_scaling
支持更大的TCP窗口.如果TCP窗口最大超过65535(64KB),必须设置该数值为1。
一般来说TCP/IP允许窗口尺寸达到65535字节。对于速度确实很高的网络而言这个值可能还是太小。这个选项允许设置上G字节的窗口大小,有利于在带宽*延迟很大的环境中使用。一旦内核认为它无法发包,就会丢弃这个包,并向发包的主机发送ICMP通知。

echo 0 >/proc/sys/net/ipv4/tcp_sack
特别针对丢失的数据包使用选择性ACK,这样有助于快速恢复。

echo 330000 >/proc/sys/net/ipv4/tcp_max_orphans
对于哪些没有附属于任何使用者文档handle的TCP sockets﹐系统所能处理的最大数量。假如超过这个数量﹐那么这些无人看管的连线将会被立即重设(reset)﹐并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御哪些简单的DoS攻击﹐千万不要依赖这个或是人为的降低这个限制﹐不过﹐如果网路条件需要比预设值更多﹐而且调整网路服务获得拖延并强制性砍掉这类状态﹐则可以提高它(或许还要增加内存)。再提醒一次﹕每一个这样的orphan都会吃掉64K不能置换的内存。

echo "10000 62000" >/proc/sys/net/ipv4/ip_local_port_range
用于向外连接的端口范围。缺省情况下其实很小:1024到4999。

others :
echo 1300000 >/proc/sys/fs/file-max
系统中的最大文件打开数