linuxcsocket
Ⅰ linux發送socket報文
使用sendto函數。
linux發送socket報搜肢文使用UDP協議發送報文,首先創建褲仿一個socket,然後設置伺服器的IP地址和埠號,最後使用sendto函數發送報文。
Linux全稱是GNU/Linux,是一種免費使用和自由胡漏纖傳播的類UNIX操作系統。
Ⅱ linux socket是什麼意思
基於Linux的SOCKET編程。
Ⅲ linux手冊翻譯——socket(2)
socket - 創建一個用於通信的端點
socket() 創建用於通信的端點並返回引用該端點的文件描述符。 成功調用時返回的文件描述符,將是當前沒有被進程打開的所有文件描述符中編號最低的。
domain 參數指定一個通信域; 以決定用於通信的協議族。 這些系列在 <sys/socket.h> 中定義。 目前 Linux 內核理解的格式包括:
當然最常用的當然是 AF_INET ,即IPV4。
上述地址族的更多詳細信息以及其他幾個地址族的信息可以在 address_families(7) 中找到。
套接字具有指定的 type ,它指定了通信語義。 當前定義的類型有:
某些套接字類型可能不會被所有協議族實現。
從 Linux 2.6.27 開始,type 參數有第二個用途:除了指定套接字類型之外,它還可以包含以下任何值的按位或,以修改 socket() 的行為:
老朋友了,上述兩個,第一個是非阻塞,第二個是執行exec時自動關閉。
protocol 指定要與套接字一起使用的特定協議。 通常只存在一個協議來支持給定協議族中的特定套接字類型 ,在這種情況下,protocol 可以指定為 0。但是,可能存在許多協議,在這種情況下,必須在此指定特定協議方式。 特定協議對應的編號可以查看文件: /etc/protocols
SOCK_STREAM 類型的套接字是全雙工位元組流。 它們不保留記錄邊界。 流套接字必須處於連接狀態,然後才能在其上發送或接收任何數據。 到另一個套接字的連接是通過 connect(2) 調用創建的。 連接後,可以使用 read(2) 和 write(2) 調用或 其變體send(2) 和 recv(2) 的來傳輸數據。 當會話完成時,可以執行 close(2)。 帶外數據也可以按照 send(2) 中的描述進行傳輸,並按照 recv(2) 中的描述進行接收。
實現 SOCK_STREAM 的通信協議確保數據不會丟失或重復。 如果協議的緩沖空間中存在一條數據在合理的時間內不能成功傳輸,則認為該連接已失效。 當 SO_KEEPALIVE 在套接字上啟用時,將會以特定於協議的方式檢查另一端是否仍然存在。 如果進程在損壞的流上發送或接收,則會引發 SIGPIPE 信號; 這會導致不處理信號的進程退出。 SOCK_SEQPACKET 套接字使用與 SOCK_STREAM 套接字相同的系統調用。 唯一的區別是 read(2) 調用將只返回請求的數據量,到達數據包中剩餘的其他數據都將被丟棄。 傳入數據報中的所有消息邊界也被保留。
SOCK_DGRAM 和 SOCK_RAW 套接字允許將數據報發送到在 sendto(2) 調用中指定的通信者。 數據報通常用 recvfrom(2) 接收,它返回下一個數據報及其發送者的地址。
SOCK_PACKET 是一種過時的套接字類型,用於直接從設備驅動程序接收原始數據包。 改用 packet(7)。
An fcntl(2) F_SETOWN operation can be used to specify a process or process group to receive a SIGURG signal when the out-of-band data arrives or SIGPIPE signal when a SOCK_STREAM connection breaks unexpectedly. This operation may also be used to set the process or process group that receives the I/O and asynchronous notification of I/O events via SIGIO. Using F_SETOWN is equivalent to an ioctl(2) call with the FIOSETOWN or SIOCSPGRP argument.
When the network signals an error condition to the protocol mole (e.g., using an ICMP message for IP) the pending error flag is set for the socket. The next operation on this socket will return the error code of the pending error. For some protocols it is possible to enable a per-socket error queue to retrieve detailed information about the error; see IP_RECVERR in ip(7).
套接字的操作由套接字選項控制。 這些選項在 <sys/socket.h> 中定義。 函數setsockopt(2) 和getsockopt(2) 用於設置和獲取選項。對於選項的描述,詳見socket(7).
成功時,將返回新套接字的文件描述符。 出錯時,返回 -1,並設置 errno 以指示錯誤。
POSIX.1-2001, POSIX.1-2008, 4.4BSD.
The SOCK_NONBLOCK and SOCK_CLOEXEC flags are Linux-specific.
socket() appeared in 4.2BSD. It is generally portable to/from non-BSD systems supporting clones of the BSD socket layer (including System V variants).
在 4.x BSD 下用於協議族的清單常量是 PF_UNIX、PF_INET 等,而 AF_UNIX、AF_INET 等用於地址族。 但是,BSD 手冊頁已經承諾:「協議族通常與地址族相同」,隨後的標准到處都使用 AF_*。
Ⅳ linux之socket , URL 訪問http伺服器
給提供一個指導步驟:
1、修改socket服務埠為80/443;
2、申請一個域名並配置IP和域名的映射,如是本地的話,請把伺服器主機名和IP地址在開發機器上做一個映射即可,如是linux機器,請在/etc/hosts文件添加如下信息,
ipmapping_hostname
Ⅳ Linux下的socket是怎麼回事,如何利用其實現區域網內的數據處理
//服務端server.c
#include
<stdio.h>
#include
<stdlib.h>
#include
<errno.h>
#include
<string.h>
#include
<sys/types.h>
#include
<netinet/in.h>
#include
<sys/socket.h>
#include
<sys/wait.h>
#define
SERVPORT
6000
/*伺服器監聽埠號
*/
#define
BACKLOG
10
/*
最大同時連接請求數
*/
#define
MAXDATASIZE
100
main()
{
char
buf[MAXDATASIZE];
int
sockfd,client_fd;
/*sock_fd:監聽socket;client_fd:數據傳輸socket
*/
struct
sockaddr_in
my_addr;
/*
本機地址信息
*/
struct
sockaddr_in
remote_addr;
/*
客戶端地址信息
*/
if
((sockfd
=
socket(AF_INET,
SOCK_STREAM,
0))
==
-1)
{
perror("socket創建出錯!");
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr
=
INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if
(bind(sockfd,
(struct
sockaddr
*)&my_addr,
sizeof(struct
sockaddr))
==
-1)
{
perror("bind出錯!");
exit(1);
}
if
(listen(sockfd,
BACKLOG)
==
-1)
{
perror("listen出錯!");
exit(1);
}
while(1)
{
sin_size
=
sizeof(struct
sockaddr_in);
if
((client_fd
=
accept(sockfd,
(struct
sockaddr
*)&remote_addr,
&sin_size))
==
-1)
{
perror("accept出錯");
continue;
}
printf("received
a
connection
from
%s\n",
inet_ntoa(remote_addr.sin_addr));
if
(!fork())
{
/*
子進程代碼段
*/
if
((recvbytes=recv(client_fd,
buf,
MAXDATASIZE,
0))
==-1)
{
perror("recv出錯!");
close(client_fd);
exit(0);
}
buf[recvbytes]
=
'\0';
printf("from
client
Received:
%s",buf);
if
(send(client_fd,
"thanks!\n",
8,
0)
==
-1)
perror("send出錯!");
close(client_fd);
exit(0);
}
close(client_fd);
}
}
//客戶端client.c
#include<stdio.h>
#include
<stdlib.h>
#include
<errno.h>
#include
<string.h>
#include
<netdb.h>
#include
<sys/types.h>
#include
<netinet/in.h>
#include
<sys/socket.h>
#define
SERVPORT
6000
#define
MAXDATASIZE
100
main(int
argc,
char
*argv[])
{
int
sockfd,
recvbytes;
char
buf[MAXDATASIZE];
struct
hostent
*host;
struct
sockaddr_in
serv_addr;
if
(argc
<
2)
{
fprintf(stderr,"Please
enter
the
server's
hostname!\n");
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL)
{
herror("gethostbyname出錯!");
exit(1);
}
if
((sockfd
=
socket(AF_INET,
SOCK_STREAM,
0))
==
-1)
{
perror("socket創建出錯!");
exit(1);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
serv_addr.sin_addr
=
*((struct
in_addr
*)host->h_addr);
bzero(&(serv_addr.sin_zero),8);
if
(connect(sockfd,
(struct
sockaddr
*)&serv_addr,
sizeof(struct
sockaddr))
==
-1)
{
perror("connect出錯!");
exit(1);
}
if
(send(sockfd,
"hello!\n",
7,
0)
==
-1)
{
perror("send出錯!");
exit(1);
}
if
((recvbytes=recv(sockfd,
buf,
MAXDATASIZE,
0))
==-1)
{
perror("recv出錯!");
exit(1);
}
buf[recvbytes]
=
'\0';
printf("Received:
%s",buf);
close(sockfd);
}
Ⅵ linux中socket是如何調用驅動程序
分為發送和接受:
發送:
首先,socketAPI會創建並把數據至一個叫sk_buff的結構體,然後依次把sk_buff交給運輸層,網路層,數據鏈路層協議進行處理,然後在填寫完sk_buff後再把他交付給驅動程序由網路設備發送出去。
接受和發送是反過程,驅動層程序一般由中斷處理收到數據包後會創建sk_buff結構體,讓後把數據和一些控制信息填進去,再把sk_buff向數據鏈路層協議交付,然後就是網路層,運輸層最後交給socketAPI介面了
Ⅶ Linux下socket並發連接數怎麼設置
並發socket連接數的多少決定於系統資源的多少,沒有一個常值的.在實際開發或者linux系統管理中也會根據需配段要進行相應的設置.
1.一般來說每一個網路連接,都會敗銷建立相應的socket句柄,同時每個連接也會有標准輸入輸出等基本的文件文件句柄,而且每一個socket連接都是進行文件操作的,因此連接數決定於系統資源.
2.Linux上一般可以通過ulimit來進行相應的資源限制,默認能打開的文件描述符自己可以查看.如下圖所示:
3.ulimit的命令格式:ulimit [-acdfHlmnpsStvw] [size]
參數說明:
-H 設置硬資源限制.
-S 設置軟資源限制.
-a 顯示當前所有的資源限制.
-c size:設置core文件的最大值.單位:blocks
-d size:設置數據段的最大值.單位:kbytes
-f size:設置創建文件的最大值.單位:blocks
-l size:設置在內存中鎖定進程的最大值.單位:kbytes
-m size:設置可以使用的培枯譽常駐內存的最大值.單位:kbytes
-n size:設置內核可以同時打開的文件描述符的最大值.單位:n
-p size:設置管道緩沖區的最大值.單位:kbytes
-s size:設置堆棧的最大值.單位:kbytes
-t size:設置CPU使用時間的最大上限.單位:seconds
-v size:設置虛擬內存的最大值.單位:kbytes
-u <程序數目> 用戶最多可開啟的程序數目
Ⅷ linux 下的socket怎麼測試是否成功
增加對Linux socket連接 最近的一個項目的最大連接數是模擬多個套接字的客戶端和伺服器之間的通信。 Linux系統由於Linux的限制,/在include / linux / posix_types.h文件中有如下的宏定義: #UNDEF __FD_SETSIZE 的#define __FD_SETSIZE 1024 這個宏是當你需要超亮梁過1024個FD,如select()函數將監聽錯誤定義的最大文件描述符1024。所以,你需要改變1024所需要的數量,但不超過65,535。但這是不夠的僅僅。 第二步你需要的文件的進程敬耐運打開的最大數量。具體的步驟是: 1,CD /usr/src/linux-2.4/include/linux 2,六limits.h中編輯文件: 的#define NR_OPEN 90240原1024 1024 的#define OPEN_MAX 10240原值 3值,六fs.h文件 的#define INR_OPEN 10240原值1024 的#define NR_FILE 65536 8192原始值,內存64 / 1M比例計算的值,1G內存的計算公式為:64 * 10. 4 1024 的#define NR_RESERVED_FILES 128原值,CD /usr/src/linux-2.4/include/net BR>五,六tcp.h中 的#define TCP_LHTABLE_SIZE的32 128原值易聽聽隊列,建立大。 - 設為與內存相關的打開文件的最大數量,系統會減慢太多。 第三步是編畝瞎譯內核,具體步驟是: 1.使清潔 2.化妝 3. make dep的 4.做的bzImage 將導入的bzImage /啟動重新啟動系統! wc命令,以目前在建立套接字連接數統計| 與超過1024個客戶端和伺服器到伺服器的終端使用netstat的連接。
Ⅸ linuxsocket阻塞如何退出
設置套接字為非阻塞模式。
1、通過設置套接字的屬性,把其從阻塞模式改為非阻塞模式,即使沒有數據凳喊到來或者連接建立,程序也不會一直等待,而是立刻返回。
2、褲碰超時機制:在代碼中設置超時機制,即如果套接字在指定時間內依然處於阻塞狀態,則退出程序。
3、信號處理:使用信號處理機制,在另一個線程中棗純野發送一個指定的信號,如SIGINT信號,當程序接收到該信號時,可以退出當前的阻塞狀態。
Ⅹ 請問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