linuxsock
㈠ linux中socket是如何调用驱动程序
分为发送和接受:
发送:
首先,socketAPI会创建并把数据至一个叫sk_buff的结构体,然后依次把sk_buff交给运输层,网络层,数据链路层协议进行处理,然后在填写完sk_buff后再把他交付给驱动程序由网络设备发送出去。
接受和发送是反过程,驱动层程序一般由中断处理收到数据包后会创建sk_buff结构体,让后把数据和一些控制信息填进去,再把sk_buff向数据链路层协议交付,然后就是网络层,运输层最后交给socketAPI接口了
㈡ 涓鏂囨闷镍侺inux镄凷ocket缂栫▼铡熺悊(钖瀹炰緥瑙f瀽)
鎺屾彙Linux Socket缂栫▼锛氢粠铡熺悊鍒板疄鎴樼ず渚
鍦ㄥ崟链虹郴缁熶腑锛岃繘绋嬮棿阃氢俊骞堕潪闅鹃桡纴镎崭綔绯荤粺鎻愪緵浜嗙¢亾銆佸懡钖岖¢亾鍜屼俊鍙风瓑澶氱嶆坠娈点傜劧钥岋纴褰撴秹鍙婄绣缁滈氢俊锛屾垜浠闇瑕佽В鍐宠繘绋嬫爣璇嗗拰鍗忚璇嗗埆镄勯梾棰樸侺inux镄勪笘鐣岄噷锛孴CP/IP鍗忚镞忎腑镄勫楁帴瀛楋纸Socket锛夋壆婕斾简镙稿绩瑙掕壊锛"涓鍒囩殕Socket"锛屽畠绠鍖栦简涓庣绣缁灭殑浜や簰銆
TCP/IP锛屽伐涓氭爣鍑嗗岗璁闆嗭纴涓崭粎鏀鎸丅erkeley濂楁帴瀛楋纴杩樻湁鍏跺揩阃熺殑UDP鍗忚锛屼綔涓篢CP/IP鍗忚镞忕殑閲嶈佹垚锻樸係ocket璁捐$簿宸э纴浣滀负鎶借薄灞傦纴瀹冩彁渚涚粺涓镄勬帴鍙o纴濡俿ocket濂楁帴瀛楋纸濡傚悓鏂囦欢镎崭綔锛夊拰濂楁帴瀛楁弿杩扮︼纸涓涓鏁存暟镙囱瘑绗︼级锛屼娇寰楀紑鍙戣呭彲浠ヨ交𨱒惧勭悊缃戠粶阃氢俊銆
镙囧嗳阌栾杈揿嚭涓岙ocket绱у瘑鐩歌繛锛0銆1銆2鍒嗗埆瀵瑰簲stdin銆乻tdout鍜宻tderr锛岃宻ocket API宸у椤湴灏呜繖浜涙暣钖堣繘UNIX绯荤粺锛屽垱寤哄楁帴瀛楀悗锛岃繑锲炵殑鎻忚堪绗︽垚涓烘搷浣灭绣缁灭殑镙稿绩宸ュ叿銆
鎻忚堪绗︽槸镎崭綔绯荤粺涓鸿繘绋嬬$悊镄勬枃浠剁粨鏋勭储寮曪纴镞犺烘槸鏂囦欢杩樻槸濂楁帴瀛桰/O锛岄氲繃鎻忚堪绗﹁繘琛屾搷浣滐纴鏄惧缑鐩磋备笖楂樻晥銆傚垱寤簊ocket镞讹纴鍙闇璋幂敤socket()鍑芥暟锛岄殢钖庣殑阃氢俊镎崭綔鍒欎緷璧栦簬濉鍏呯殑濂楁帴瀛楀睘镐с
链嶅姟鍣ㄧ镄勯氢俊娴佺▼链夊簭涓旈昏緫娓呮榈锛氩埯濮嫔寲Socket锛岄氲繃bind()鎸囧畾鐩戝惉鍦板潃鍜岀鍙o纴鎺ョ潃listen()绛夊緟杩炴帴锛宎ccept()鎺ユ敹骞跺勭悊瀹㈡埛绔镄勮繛鎺ヨ锋眰锛屼氦浜掔粨𨱒熷悗锛岄氲繃close()鍏抽棴杩炴帴銆傜悊瑙h繖浜涙ラよ呖鍏抽吨瑕併
鍦ㄥ垱寤篠ocket镞讹纴鎴戜滑阃氲繃socket()鍑芥暟鐢熸垚濂楁帴瀛楁弿杩扮︼纴钖屾椂鍙浠ラ夋嫨涓嶅悓镄勫岗璁镞忥纸AF_INET, AF_INET6, AF_LOCAL绛夛级鍜屽楁帴瀛楃被鍨嬶纸濡係OCK_STREAM鍜孲OCK_DGRAM锛夛纴杩欎簺缁勫悎纭淇濅简阃氢俊镄勫嗳纭镐у拰鍏煎规с侠ind()鍑芥暟鍒欑粦瀹歴ocket鍒颁竴涓鐗瑰畾镄勫湴鍧锛屾湇锷″櫒阃氩父鍦╨isten鍓岖粦瀹氱啛鐭ュ湴鍧銆
鐞呜В澶х鍜屽皬绔妯″纺瀵逛簬姝g‘澶勭悊缃戠粶瀛楄妭搴忚呖鍏抽吨瑕併傚湪杩涜屽楁帴瀛楁搷浣沧椂锛屽姟蹇呯‘淇濇暟鎹鎸夌绣缁滃瓧鑺傚簭鍙戦侊纴浠ラ伩鍏嶆綔鍦ㄧ殑娣蜂贡銆备笁娆℃彙镓嬶纸瀹㈡埛绔疭YN銆佹湇锷″櫒SYN+ACK銆佸㈡埛绔疉CK锛夊湪杩炴帴寤虹珛涓璧风潃鍏抽敭浣灭敤锛岃宭isten()鍜宑onnect()鍒欐槸杩欎簺杩囩▼镄勮皟鐢ㄨ呫
链嶅姟鍣ㄩ氲繃accept()鎺ユ敹杩炴帴璇锋眰锛屽尯鍒嗙洃钖濂楁帴瀛椾笌杩炴帴濂楁帴瀛楋纴杩椤逛簬鐞呜В链嶅姟鍣ㄥ拰瀹㈡埛绔镄勮掕壊镊冲叧閲嶈併傚湪瀹为檯镎崭綔涓锛屽备娇鐢╮ecvmsg/sendmsg杩涜岀绣缁泪/O锛岃诲啓镎崭綔闇瑕佺壒鍒澶勭悊寮傚父𨱍呭喌锛屽备腑鏂鎴栬繛鎺ユ柇寮銆
链钖庯纴TCP杩炴帴镄勫缓绔嫔拰鍏抽棴阆靛惊涓ユ牸镄勫洓娆℃尌镓嫔岗璁锛氢笁娆℃彙镓嫔缓绔嬭繛鎺ワ纴锲涙℃尌镓嬬‘淇濇暟鎹浼犺緭瀹屾垚銆傚湪链嶅姟鍣ㄧ锛屼竴涓绀轰緥绋嫔簭鍙鑳藉寘𨰾鐩戝惉鐗瑰畾绔鍙c佹帴鍙楄繛鎺ヨ锋眰骞朵氦浜掓暟鎹锛屽悓镞跺勭悊鍙鑳界殑TIME_WAIT鐘舵侊纴纭淇濇暟鎹浼犺緭镄勫畬鏁存у拰鍙闱犳с
镞犺烘槸瀹㈡埛绔杩樻槸链嶅姟鍣锛孲ocket缂栫▼镄勫疄璺甸兘闇瑕佹帉鎻¤繖浜涙牳蹇冩傚康銆傞氲繃瀹为檯镎崭綔鍜屾堜緥鍒嗘瀽锛屼竴姝ユユ彮寮Socket缂栫▼镄勭炵橀溃绾憋纴浣犲皢鑳藉熻嚜濡傚湴鍦↙inux涓栫晫涓杩涜岄珮鏁堢殑杩涚▼闂撮氢俊銆
㈢ linux socket和sock结构体的区别
//**************************************************************************
/* 1、每一个打开的文件、socket等等都用一个file数据结构代表,这样文件和socket就通过inode->u(union)中的各个成员来区别:
struct inode {
.....................
union {
struct ext2_inode_info ext2_i;
struct ext3_inode_info ext3_i;
struct socket socket_i;
.....................
} u; };
2、每个socket数据结构都有一个sock数据结构成员,sock是对socket的扩充,两者一一对应,socket->sk指向对应的sock,sock->socket
指向对应的socket;
3、socket和sock是同一事物的两个侧面,为什么不把两个数据结构合并成一个呢?这是因为socket是inode结构中的一部分,即把inode结
构内部的一个union用作socket结构。由于插口操作的特殊性,这个数据结构中需要有大量的结构成分,如果把这些成分全部放到socket
结构中,则inode结构中的这个union就会变得很大,从而inode结构也会变得很大,而对于其他文件系统这个union是不需要这么大的,
所以会造成巨大浪费,系统中使用inode结构的数量要远远超过使用socket的数量,故解决的办法就是把插口分成两部分,把与文件系
统关系密切的放在socket结构中,把与通信关系密切的放在另一个单独结构sock中;
*/
struct socket
{
socket_state state; // 该state用来表明该socket的当前状态
typedef enum {
SS_FREE = 0, /* not allocated */
SS_UNCONNECTED, /* unconnected to any socket */
SS_CONNECTING, /* in process of connecting */
SS_CONNECTED, /* connected to socket */
SS_DISCONNECTING /* in process of disconnecting */
} socket_state;
unsigned long flags; //该成员可能的值如下,该标志用来设置socket是否正在忙碌
#define SOCK_ASYNC_NOSPACE 0
#define SOCK_ASYNC_WAITDATA 1
#define SOCK_NOSPACE 2
struct proto_ops *ops; //依据协议邦定到该socket上的特定的协议族的操作函数指针,例如IPv4 TCP就是inet_stream_ops
struct inode *inode; //表明该socket所属的inode
struct fasync_struct *fasync_list; //异步唤醒队列
struct file *file; //file回指指针
struct sock *sk; //sock指针
wait_queue_head_t wait; //sock的等待队列,在TCP需要等待时就sleep在这个队列上
short type; //表示该socket在特定协议族下的类型例如SOCK_STREAM,
unsigned char passcred; //在TCP分析中无须考虑
};
㈣ Linux 进程间套接字通信(Socket)基础知识
姓名:罗学元 学号:21181214375 学院:广州研究院
【嵌牛导读】Linux进程间套接字通信基础
【嵌牛鼻子】Linux 进程间套接字及通信介绍
【嵌牛提问】Linux进程间套接字包含哪些内容,如何实现通信
一、套接字(Socket)通信原理
套接字通信允许互联的位于不同计算机上的进程之间实现通信功能。
二、套接字的属性
套接字的特性由3个属性确定,它们分别是:域、类型和协议。
1. 套接字的域
它指定套接字通信中使用的网络介质,最常见的套接字域是AF_INET,它指的是Internet网络。当客户使用套接字进行跨网络的连接时,它就需要用到服务器计算机的IP地址和端口来指定一台联网机器上的某个特定服务,所以在使用socket作为通信的终点,服务器应用程序必须在开始通信之前绑定一个端口,服务器在指定的端口等待客户的连接。
另一个域AF_UNIX表示UNIX文件系统,就是文件输入/输出,它的地址就是文件名。
2. 套接字类型
因特网提供了两种通信机制:流(stream)和数据报(datagram),因而套接字的类型也就分为流套接字和数据报套接字。我们主要看流套接字。
流套接字由类型SOCK_STREAM指定,它们是在AF_INET域中通过TCP/IP连接实现,同时也是AF_UNIX中常用的套接字类型。
流套接字提供的是一个有序、可靠、双向字节流的连接,因此发送的数据可以确保不会丢失、重复或乱序到达,而且它还有一定的出错后重新发送的机制。
与流套接字相对的是由类型SOCK_DGRAM指定的数据报套接字,它不需要建立连接和维持一个连接,它们在AF_INET中通常是通过UDP/IP实现的。它对可以发送的数据的长度有限制,数据报作为一个单独的网络消息被传输,它可能丢失、复制或错乱到达,UDP不是一个可靠的协议,但是它的速度比较高,因为它并不需要总是要建立和维持一个连接。
3.套接字协议
只要底层的传输机制允许不止一个协议来提供要求的套接字类型,我们就可以为套接字选择一个特定的协议。通常只需要使用默认值。
三、套接字地址
每个套接字都有其自己的地址格式,对于AF_UNIX域套接字来说,它的地址由结构sockaddr_un来描述,该结构定义在头文件
struct sockaddr_un{
sa_family_t sun_family; //AF_UNIX,它是一个短整型
char sum_path[]; //路径名
};
对于AF_INET域套接字来说,它的地址结构由sockaddr_in来描述,它至少包括以下几个成员:
struct sockaddr_in{
short int sin_family; //AN_INET
unsigned short int sin_port; //端口号
struct in_addr sin_addr; //IP地址
}
而in_addr被定义为:
struct in_addr{
unsigned long int s_addr;
}
四、基于流套接字的客户/服务器的工作流程
使用socket进行进程通信的进程采用的客户/服务器系统是如何工作的呢?
1.服务器端
首先,服务器应用程序用系统调用socket来创建一个套接字,它是系统分配给该服务器进程的类似文件描述符的资源,它不能与其他的进程共享。
接下来,服务器进程会给套接字起个名字,我们使用系统调用bind来给套接字命名。然后服务器进程就开始等待客户连接到这个套接字。
然后,系统调用listen来创建一个队列,并将其用于存放来自客户的进入连接。
最后,服务器通过系统调用accept来接受客户的连接。它会创建一个与原有的命名套接不同的新套接字,这个套接字只用于与这个特定客户端进行通信,而命名套接字(即原先的套接字)则被保留下来继续处理来自其他客户的连接。
2.客户端
基于socket的客户端比服务器端简单。同样,客户应用程序首先调用socket来创建一个未命名的套接字,然后讲服务器的命名套接字作为一个地址来调用connect与服务器建立连接。
一旦连接建立,我们就可以像使用底层的文件描述符那样用套接字来实现双向数据的通信。
㈤ 请问linux怎么增大socket连接上限
1、修改用户进程可打开文件数限制
在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,
最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统
为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。
可使用ulimit命令查看系统允许当前用户进程打开的文件数限制:
[speng@as4 ~]$ ulimit -n
1024
这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去
每个进程必然打开的标准输入,标准输出,标准错误,服务器监听 socket,
进程间通讯的unix域socket等文件,那么剩下的可用于客户端socket连接的文件数就
只有大概1024-10=1014个左右。也就是说缺省情况下,基于Linux的通讯程序最多允许
同时1014个TCP并发连接。
对于想支持更高数量的TCP并发连接的通讯处理程序,就必须修改Linux对当前用户的
进程同时打开的文件数量的软限制(soft limit)和硬限制(hardlimit)。其中软限制
是指Linux在当前系统能够承受的范围内进一步限制用户同时打开的文件数;硬限制
则是根据系统硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量。
通常软限制小于或等于硬限制。
修改上述限制的最简单的办法就是使用ulimit命令:
[speng@as4 ~]$ ulimit -n
上述命令中,在中指定要设置的单一进程允许打开的最大文件数。如果系统回显
类似于“Operation notpermitted”之类的话,说明上述限制修改失败,实际上是
因为在中指定的数值超过了Linux系统对该用户打开文件数的软限制或硬限制。
因此,就需要修改Linux系统对用户的关于打开文件数的软限制和硬限制。
第一步,修改/etc/security/limits.conf文件,在文件中添加如下行:
speng soft nofile 10240
speng hard nofile 10240
其中speng指定了要修改哪个用户的打开文件数限制,可用’*'号表示修改所有用户的限制;
soft或hard指定要修改软限制还是硬限制;10240则指定了想要修改的新的限制值,
即最大打开文件数(请注意软限制值要小于或等于硬限制)。修改完后保存文件。
第二步,修改/etc/pam.d/login文件,在文件中添加如下行:
session required /lib/security/pam_limits.so
这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对
该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),
而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。
修改完后保存此文件。
第三步,查看Linux系统级的最大打开文件数限制,使用如下命令:
[speng@as4 ~]$ cat /proc/sys/fs/file-max
12158
这表明这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)12158个文件,
是Linux系统级硬限制,所有用户级的打开文件数限制都不应超过这个数值。通常这个系统级
硬限制是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,
如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值。
修改此硬限制的方法是修改/etc/rc.local脚本,在脚本中添加如下行:
echo 22158 > /proc/sys/fs/file-max
这是让Linux在启动完成后强行将系统级打开文件数硬限制设置为22158。修改完后保存此文件。
完成上述步骤后重启系统,一般情况下就可以将Linux系统对指定用户的单一进程允许同时
打开的最大文件数限制设为指定的数值。如果重启后用 ulimit-n命令查看用户可打开文件数限制
仍然低于上述步骤中设置的最大值,这可能是因为在用户登录脚本/etc/profile中使用ulimit -n命令
已经将用户可同时打开的文件数做了限制。由于通过ulimit-n修改系统对用户可同时打开文件的
最大数限制时,新修改的值只能小于或等于上次 ulimit-n设置的值,因此想用此命令增大这个
限制值是不可能的。
所以,如果有上述问题存在,就只能去打开/etc/profile脚本文件,
在文件中查找是否使用了ulimit-n限制了用户可同时打开的最大文件数量,如果找到,
则删除这行命令,或者将其设置的值改为合适的值,然后保存文件,用户退出并重新登录系统即可。
通过上述步骤,就为支持高并发TCP连接处理的通讯处理程序解除关于打开文件数量方面的系统限制。
2、修改网络内核对TCP连接的有关限制
在Linux上编写支持高并发TCP连接的客户端通讯处理程序时,有时会发现尽管已经解除了系统
对用户同时打开文件数的限制,但仍会出现并发TCP连接数增加到一定数量时,再也无法成功
建立新的TCP连接的现象。出现这种现在的原因有多种。
第一种原因可能是因为Linux网络内核对本地端口号范围有限制。此时,进一步分析为什么无法
建立TCP连接,会发现问题出在connect()调用返回失败,查看系统错误提示消息是“Can’t assign requestedaddress”。同时,如果在此时用tcpmp工具监视网络,会发现根本没有TCP连接时客户端
发SYN包的网络流量。这些情况说明问题在于本地Linux系统内核中有限制。
其实,问题的根本原因
在于Linux内核的TCP/IP协议实现模块对系统中所有的客户端TCP连接对应的本地端口号的范围
进行了限制(例如,内核限制本地端口号的范围为1024~32768之间)。当系统中某一时刻同时
存在太多的TCP客户端连接时,由于每个TCP客户端连接都要占用一个唯一的本地端口号
(此端口号在系统的本地端口号范围限制中),如果现有的TCP客户端连接已将所有的本地端口号占满,
则此时就无法为新的TCP客户端连接分配一个本地端口号了,因此系统会在这种情况下在connect()
调用中返回失败,并将错误提示消息设为“Can’t assignrequested address”。
有关这些控制
逻辑可以查看Linux内核源代码,以linux2.6内核为例,可以查看tcp_ipv4.c文件中如下函数:
static int tcp_v4_hash_connect(struct sock *sk)
请注意上述函数中对变量sysctl_local_port_range的访问控制。变量sysctl_local_port_range
的初始化则是在tcp.c文件中的如下函数中设置:
void __init tcp_init(void)
内核编译时默认设置的本地端口号范围可能太小,因此需要修改此本地端口范围限制。
第一步,修改/etc/sysctl.conf文件,在文件中添加如下行:
net.ipv4.ip_local_port_range = 1024 65000
这表明将系统对本地端口范围限制设置为1024~65000之间。请注意,本地端口范围的最小值
必须大于或等于1024;而端口范围的最大值则应小于或等于65535。修改完后保存此文件。
第二步,执行sysctl命令:
[speng@as4 ~]$ sysctl -p
如果系统没有错误提示,就表明新的本地端口范围设置成功。如果按上述端口范围进行设置,
则理论上单独一个进程最多可以同时建立60000多个TCP客户端连接。
第二种无法建立TCP连接的原因可能是因为Linux网络内核的IP_TABLE防火墙对最大跟踪的TCP
连接数有限制。此时程序会表现为在 connect()调用中阻塞,如同死机,如果用tcpmp工具监视网络,
也会发现根本没有TCP连接时客户端发SYN包的网络流量。由于 IP_TABLE防火墙在内核中会对
每个TCP连接的状态进行跟踪,跟踪信息将会放在位于内核内存中的conntrackdatabase中,
这个数据库的大小有限,当系统中存在过多的TCP连接时,数据库容量不足,IP_TABLE无法为
新的TCP连接建立跟踪信息,于是表现为在connect()调用中阻塞。此时就必须修改内核对最大跟踪
的TCP连接数的限制,方法同修改内核对本地端口号范围的限制是类似的:
第一步,修改/etc/sysctl.conf文件,在文件中添加如下行:
net.ipv4.ip_conntrack_max = 10240
这表明将系统对最大跟踪的TCP连接数限制设置为10240。请注意,此限制值要尽量小,
以节省对内核内存的占用。
第二步,执行sysctl命令:
[speng@as4 ~]$ sysctl -p
如果系统没有错误提示,就表明系统对新的最大跟踪的TCP连接数限制修改成功。
如果按上述参数进行设置,则理论上单独一个进程最多可以同时建立10000多个TCP客户端连接。
3、使用支持高并发网络I/O的编程技术
在Linux上编写高并发TCP连接应用程序时,必须使用合适的网络I/O技术和I/O事件分派机制。
可用的I/O技术有同步I/O,非阻塞式同步I/O(也称反应式I/O),以及异步I/O。在高TCP并发的情形下,
如果使用同步I/O,这会严重阻塞程序的运转,除非为每个TCP连接的I/O创建一个线程。
但是,过多的线程又会因系统对线程的调度造成巨大开销。因此,在高TCP并发的情形下使用
同步 I/O是不可取的,这时可以考虑使用非阻塞式同步I/O或异步I/O。非阻塞式同步I/O的技术包括使用select(),poll(),epoll等机制。异步I/O的技术就是使用AIO。
从I/O事件分派机制来看,使用select()是不合适的,因为它所支持的并发连接数有限(通常在1024个以内)。
如果考虑性能,poll()也是不合适的,尽管它可以支持的较高的TCP并发数,但是由于其采用
“轮询”机制,当并发数较高时,其运行效率相当低,并可能存在I/O事件分派不均,导致部分TCP
连接上的I/O出现“饥饿”现象。而如果使用epoll或AIO,则没有上述问题(早期Linux内核的AIO技术
实现是通过在内核中为每个 I/O请求创建一个线程来实现的,这种实现机制在高并发TCP连接的情形下
使用其实也有严重的性能问题。但在最新的Linux内核中,AIO的实现已经得到改进)。
综上所述,在开发支持高并发TCP连接的Linux应用程序时,应尽量使用epoll或AIO技术来实现并发的
TCP连接上的I/O控制,这将为提升程序对高并发TCP连接的支持提供有效的I/O保证。
内核参数sysctl.conf的优化
/etc/sysctl.conf 是用来控制linux网络的配置文件,对于依赖网络的程序(如web服务器和cache服务器)
非常重要,RHEL默认提供的最好调整。
推荐配置(把原/etc/sysctl.conf内容清掉,把下面内容复制进去):
net.ipv4.ip_local_port_range = 1024 65536
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn = 262144
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
这个配置参考于cache服务器varnish的推荐配置和SunOne 服务器系统优化的推荐配置。
varnish调优推荐配置的地址为:http://varnish.projects.linpro.no/wiki/Performance
不过varnish推荐的配置是有问题的,实际运行表明“net.ipv4.tcp_fin_timeout = 3”的配置
会导致页面经常打不开;并且当网友使用的是IE6浏览器时,访问网站一段时间后,所有网页都会
打不开,重启浏览器后正常。可能是国外的网速快吧,我们国情决定需要
调整“net.ipv4.tcp_fin_timeout = 10”,在10s的情况下,一切正常(实际运行结论)。
修改完毕后,执行:
/sbin/sysctl -p /etc/sysctl.conf
/sbin/sysctl -w net.ipv4.route.flush=1
命令生效。为了保险起见,也可以reboot系统。
调整文件数:
linux系统优化完网络必须调高系统允许打开的文件数才能支持大的并发,默认1024是远远不够的。
执行命令:
Shell代码
echo ulimit -HSn 65536 >> /etc/rc.local
echo ulimit -HSn 65536 >>/root/.bash_profile
ulimit -HSn 65536