Pelayan web dan pelayan cache, di bawah konkurensi tinggi, had bilangan maksimum sambungan soket dilaraskan:
1. Tukar had bilangan maksimum fail yang boleh dibuka oleh proses pengguna.
Berkesan serta merta: ulimit-nxxx
Berkesan selama-lamanya:
gema "ulimit-HSn65536">>/etc/rc.local
gema "ulimit-HSn65536">>/root/.bash_profile
ulimit-HSn65536
2. Tukar had kernel rangkaian pada bilangan maksimum sambungan tcp.
/etc/sysctl.conf
一、
Pada platform Linux, sama ada anda menulis program klien atau program pelayan, apabila memproses sambungan TCP serentak yang luas, bilangan mata wang tertinggi akan tertakluk kepada had sistem pada bilangan fail yang boleh dibuka oleh pengguna pada masa yang sama masa dalam satu proses (ini kerana Sistem mencipta pemegang soket untuk setiap sambungan TCP, dan setiap pemegang soket juga merupakan pemegang fail). Contohnya: program redis yang hanya memulakan satu proses hanya boleh membuka 1024 fail (lalai 1024) (1024 sambungan tcp = 1024 pemegang sambungan soket = 1024 pemegang fail),
Anda boleh menggunakan arahan ulimit untuk menyemak had bilangan fail yang sistem membenarkan proses pengguna semasa dibuka:
$ulimit-n
1024
Ini bermakna setiap proses pengguna semasa dibenarkan membuka sehingga 1024 fail pada masa yang sama Antara 1024 fail ini, input standard, output standard, ralat standard, soket mencuri dengar pelayan dan domain unix komunikasi antara proses yang. mesti dibuka oleh setiap proses mesti dikeluarkan soket dan fail lain, jadi bilangan fail yang tinggal yang boleh digunakan untuk sambungan soket klien hanya kira-kira 1024-10=1014. Maksudnya, secara lalai, program komunikasi berasaskan Linux membenarkan sehingga 1014 sambungan TCP serentak pada masa yang sama.
Untuk pengendali komunikasi yang ingin menyokong bilangan sambungan TCP serentak yang lebih tinggi, anda mesti menukar bilangan fail yang dibuka oleh Linux pada masa yang sama untuk proses pengguna semasa:
Had lembut (softlimit): merujuk kepada Linux mengehadkan lagi bilangan fail yang boleh dibuka oleh pengguna pada masa yang sama dalam julat yang boleh ditanggung oleh sistem semasa
Had keras: Bilangan maksimum fail yang boleh dibuka secara serentak oleh sistem dianggarkan berdasarkan sumber perkakasan sistem (terutamanya memori video sistem).
Secara amnya had lembut lebih besar daripada atau sama dengan had keras
Cara paling mudah untuk menukar had bilangan maksimum fail yang dibuka dengan satu proses adalah dengan menggunakan arahan ulimit:
[speng@as4~]$ulimit-n
Dalam arahan di atas, nyatakan bilangan maksimum fail yang dibenarkan untuk dibuka oleh satu proses. Jika sistem menggemakan sesuatu seperti "Operationnotpermitted", ini bermakna perubahan had di atas gagal Sebenarnya, ia adalah kerana nilai yang dinyatakan di tangan melebihi had lembut atau had keras sistem Linux pada bilangan fail yang dibuka oleh pengguna. Oleh itu, adalah perlu untuk menukar had lembut dan keras sistem Linux pada bilangan fail terbuka untuk pengguna.
Langkah pertama ialah menukar fail /etc/security/limits.conf dan tambah baris berikut pada fail:
spengsoftnofile10240
spenghardnofile10240
speng menentukan had bilangan fail terbuka untuk pengguna itu ditukar Tanda '*' boleh digunakan untuk menunjukkan perubahan had untuk semua pengguna
soft atau hard menentukan sama ada untuk menukar had lembut atau had keras; 10240 menentukan nilai had baharu yang ingin anda ubah, iaitu bilangan maksimum fail terbuka (sila ambil perhatian bahawa nilai had lembut mestilah lebih besar daripada atau sama. kepada had yang sukar). Simpan fail selepas membuat perubahan.
Langkah kedua ialah menukar fail /etc/pam.d/login dan tambah baris berikut pada fail:
sessionrequired/lib/security/pam_limits.so Ini memberitahu Linux bahawa selepas pengguna melengkapkan log masuk sistem, modul pam_limits.so harus dipanggil untuk menetapkan had maksimum sistem pada bilangan pelbagai sumber yang boleh digunakan oleh pengguna (termasuk bilangan maksimum sumber yang boleh dibuka oleh pengguna) had nombor fail), dan modul pam_limits.so akan membaca konfigurasi daripada fail /etc/security/limits.conf untuk menetapkan nilai had ini. Simpan fail ini selepas membuat perubahan.
Langkah ketiga ialah menyemak had peringkat sistem Linux pada bilangan maksimum fail terbuka, gunakan arahan berikut:
[speng@as4~]$cat/proc/sys/fs/file-max
12158
Ini menunjukkan bahawa sistem Linux ini boleh membenarkan sehingga 12158 fail dibuka pada masa yang sama (iaitu, termasuk jumlah bilangan fail yang dibuka oleh semua pengguna), yang merupakan had keras peringkat sistem Linux had bilangan fail terbuka tidak boleh melebihi nilai ini. Secara amnya, had keras peringkat sistem ini ialah had maksimum terbaik pada bilangan fail yang dibuka pada masa yang sama berdasarkan sumber perkakasan sistem apabila sistem Linux dimulakan Jika tiada keperluan khas, had ini tidak boleh diubah melainkan anda ingin mengehadkan bilangan fail yang dibuka pada peringkat pengguna Tetapkan nilai yang melebihi had ini.
Cara untuk menukar had keras ini ialah menukar skrip /etc/rc.local dan tambah baris berikut pada skrip:
echo22158>/proc/sys/fs/file-max
Ini adalah untuk memaksa Linux menetapkan had keras peringkat sistem pada bilangan fail terbuka kepada 22158 selepas permulaan selesai.
Selepas melengkapkan langkah di atas, mulakan semula sistem Biasanya, anda boleh menetapkan bilangan maksimum fail yang sistem Linux membenarkan satu proses pengguna tertentu dibuka pada masa yang sama kepada nilai yang ditentukan. Jika selepas memulakan semula, anda menggunakan perintah ulimit-n untuk menyemak bahawa had bilangan fail yang boleh dibuka oleh pengguna sentiasa lebih tinggi daripada nilai maksimum yang ditetapkan dalam langkah di atas, ini mungkin kerana perintah ulimit-n dalam skrip log masuk pengguna /etc/profile telah pun melumpuhkan bilangan fail yang boleh dibuka oleh pengguna pada masa yang sama Bilangan fail adalah terhad. Kerana apabila anda menggunakan ulimit-n untuk menukar had sistem pada bilangan maksimum fail yang boleh dibuka oleh pengguna pada masa yang sama, nilai baru yang diubah hanya boleh lebih besar atau sama dengan nilai yang telah ditetapkan oleh ulimit-n , adalah mustahil untuk menggunakan arahan ini untuk mengurangkan nilai had ini.
Jadi, jika masalah di atas wujud, anda hanya boleh membuka fail skrip /etc/profile dan cari dalam fail untuk melihat sama ada ulimit-n digunakan untuk mengehadkan bilangan maksimum fail yang boleh dibuka oleh pengguna pada masa yang sama. Jika ditemui, padamkan arahan baris ini atau tukar nilai yang ditetapkan kepada nilai yang sesuai, simpan fail, dan kemudian pengguna boleh keluar dan log masuk ke sistem semula. Melalui langkah di atas, had sistem pada bilangan fail terbuka ditarik balik untuk program pemprosesan komunikasi yang menyokong pemprosesan sambungan TCP konkurensi tinggi.
2. Ubah suai sekatan kernel rangkaian pada sambungan TCP
Apabila menulis pengendali komunikasi pelanggan di Linux yang menyokong sambungan TCP konkurensi tinggi, kadangkala anda mendapati bahawa walaupun sistem telah menaikkan had bilangan fail yang boleh dibuka oleh pengguna pada masa yang sama, masih akan ada masalah apabila bilangan sambungan TCP serentak jatuh ke nombor tertentu Ia juga gagal mewujudkan sambungan TCP baharu. Terdapat banyak sebab untuk kejadian ini.
第一种诱因可能是由于Linux网路内核对本地端标语范围有限制。此时,进一步剖析为何未能完善TCP联接,会发觉问题出在connect()调用返回失败,查看系统错误提示消息是"Can'tassignrequestedaddress".同时,假如在此时用tcpdump工具监视网路,会发觉根本没有TCP联接时顾客端发SYN包的网路流量。这种情况说明问题在于本地Linux系统内核中有限制。
虽然,问题的根本缘由在于Linux内核的TCP/IP合同实现模块对系统中所有的顾客端TCP联接对应的本地端标语的范围进行了限制(比如,内核限制本地端标语的范围为1024~32768之间)。当系统中某一时刻同时存在太多的TCP顾客端联接时,因为每位TCP顾客端联接都要占用一个惟一的本地端标语(此端标语在系统的本地端标语范围限制中),假如现有的TCP顾客端联接已将所有的本地端标语占满,则此时就难以为新的TCP顾客端联接分配一个本地端标语了,为此系统会在这些情况下在connect()调用中返回失败,并将错误提示消息设为"Can'tassignrequestedaddress".
有关这种控制逻辑可以查看Linux内核源代码,以linux2.6内核为例,可以查看tcp_ipv4.c文件中如下函数:
staticinttcp_v4_hash_connect(structsock*sk)
请注意上述函数中对变量sysctl_local_port_range的访问控制。变量sysctl_local_port_range的初始化则是在tcp.c文件中的如下函数中设置:
void__inittcp_init(void)
内核编译时默认设置的本地端标语范围可能太小,因而须要更改此本地端口范围限制。
第一步,更改/etc/sysctl.conf文件linux系统镜像下载,在文件中添加如下行:
net.ipv4.ip_local_port_range=102465000
这表明将系统对本地端口范围限制设置为1024~65000之间。请注意,本地端口范围的最小值必须小于或等于1024;而端口范围的最大值则应大于或等于65535.更改完后保存此文件。
第二步,执行sysctl命令:
[speng@as4~]$sysctl-p
假如系统没有错误提示,就表明新的本地端口范围设置成功。假如按上述端口范围进行设置,则理论上单独一个进程最多可以同时完善60000多个TCP顾客端联接。
第二种未能完善TCP联接的诱因可能是由于Linux网路内核的防火墙对最大跟踪的TCP联接数有限制。此时程序会表现为在connect()调用中阻塞,就像关机,假如用tcpdump工具监视网路,也会发觉根本没有TCP联接时顾客端发SYN包的网路流量。因为防火墙在内核中会对每位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顾客端联接。
三、
使用支持高并发网路I/O的编程技术在Linux上编撰高并发TCP联接应用程序时,必须使用合适的网路I/O技术和I/O风波分派机制。可用的I/O技术有同步I/O,非阻塞式同步I/O(亦称反应式I/O),以及异步I/O.在高TCP并发的情形下,假如使用同步I/O,这会严重阻塞程序的运转,除非为每位TCP联接的I/O创建一个线程。
然而linux tcp连接数限制,过多的线程又会因系统对线程的调度引起巨大开支。为此,在高TCP并发的情形下使用同步I/O是不可取的,这时可以考虑使用非阻塞式同步I/O或异步I/O.非阻塞式同步I/O的技术包括使用select(),poll(),epoll等机制。异步I/O的技术就是使用AIO.
从I/O风波分派机制来看,使用select()是不合适的,由于它所支持的并发联接数有限(一般在1024个以内)。假如考虑性能,poll()也是不合适的linux tcp连接数限制,虽然它可以支持的较高的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内容清掉,把下边内容复制进去):
cp/etc/sysctl.conf/etc/sysctl.conf.bak
echo"">/etc/sysctl.conf
vim/etc/sysctl.conf
net.ipv4.ip_local_port_range=102465535
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=40968738016777216
net.ipv4.tcp_wmem=40966553616777216
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
dev_max_backlog=30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn=10240
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推荐的配置是有问题的,实际运行表明"net.ipv4.tcp_fin_timeout=3"的配置会造成页面常常打不开;而且当网友使用的是IE6浏览器时,访问网站一段时间后,所有网页就会打不开,重启浏览器后正常。可能是美国的网速快吧,我们国情决定须要调整"net.ipv4.tcp_fin_timeout=10",在10s的情况下,一切正常(实际运行推论)。
更改完毕后,执行:
sysctl-p/etc/sysctl.conf
sysctl-wnet.ipv4.route.flush=1
命令生效。为了保险起见,也可以reboot系统。
调整打开最大文件句柄数(单个进程最大tcp联接数=单个进程最大socket联接数):
linux系统优化完网路必须调高系统容许打开的文件数能够支持大的并发,默认1024是远远不够的。
执行命令:
Shell代码
echo"ulimit-HSn65536">>/etc/rc.local
echo"ulimit-HSn65536">>/root/.bash_profile
ulimit-HSn65535
Atas ialah kandungan terperinci Cara melaraskan bilangan maksimum had sambungan soket untuk pelayan web dan pelayan cache di bawah konkurensi tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!