Wenn nicht erforderlich, schalten Sie die iptables-Firewall aus oder deinstallieren Sie sie und verhindern Sie, dass der Kernel das iptables-Modul lädt. Diese Module können die Parallelitätsleistung beeinträchtigen.
Allgemeine Distributionen begrenzen einen einzelnen Prozess auf maximal 1024 Dateien, was bei weitem nicht den hohen Anforderungen an die Parallelität entspricht. Der Anpassungsprozess ist wie folgt: Geben Sie bei ein # Eingabeaufforderung Geben Sie Folgendes ein:
# ulimit–n 65535
Legen Sie die maximale Anzahl von Dateien, die von einem einzelnen, von Root gestarteten Prozess geöffnet werden können, auf 65535 fest. Wenn das System etwas wie „Vorgang nicht zulässig“ ausgibt, bedeutet dies, dass die obige Grenzwertänderung fehlgeschlagen ist. Tatsächlich überschreitet der angegebene Wert das weiche oder harte Limit des Linux-Systems für die Anzahl der Dateien, die der Benutzer öffnen kann. Daher ist es notwendig, die Soft- und Hard-Limits des Linux-Systems für die Anzahl geöffneter Dateien für Benutzer zu ändern.
Der erste Schritt besteht darin, die Datei „limits.conf“ zu ändern und Folgendes hinzuzufügen:
# vim /etc/security/limits.conf * softnofile 65536 * hard nofile65536
Das „*“-Zeichen gibt an, dass die Grenzwerte aller Benutzer geändert werden sollen; weich oder hart gibt an, ob der weiche Grenzwert oder der harte Grenzwert geändert werden soll diejenigen, die Sie ändern möchten. Der neue Grenzwert ist die maximale Anzahl geöffneter Dateien (bitte beachten Sie, dass der Soft-Limit-Wert kleiner oder gleich dem Hard-Limit sein muss). Speichern Sie die Datei, nachdem Sie Änderungen vorgenommen haben. Der zweite Schritt besteht darin, die Datei /etc/pam.d/login zu ändern und der Datei die folgende Zeile hinzuzufügen:
# vim /etc/pam.d/login sessionrequired /lib/security/pam_limits.so
Dies teilt Linux mit, dass nach Abschluss der Systemanmeldung des Benutzers das Modul pam_limits.so zum Festlegen aufgerufen werden sollte das System, das dem Benutzer zur Verfügung stehen soll (einschließlich der Begrenzung der maximalen Anzahl von Dateien, die ein Benutzer öffnen kann), und das Modul pam_limits.so liest die Konfiguration aus /etc/. Sie können diese Grenzwerte in der Datei security/limits.conf festlegen. Speichern Sie diese Datei nach der Änderung.
第三步,查看Linux系统级的最大打开文件数限制,使用如下命令:
# cat/proc/sys/fs/file-max 32568
这表明这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)32568个文件,是Linux系统级硬限制,所有用户级的打开文件数限制都不应超过这个数值。通常这个系统级硬限制是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值。修改此硬限制的方法是修改/etc/sysctl.conf文件内fs.file-max= 131072
这是让Linux在启动完成后强行将系统级打开文件数硬限制设置为131072。修改完后保存此文件。
完成上述步骤后重启系统,一般情况下就可以将Linux系统对指定用户的单一进程允许同时打开的最大文件数限制设为指定的数值。如果重启后用ulimit-n命令查看用户可打开文件数限制仍然低于上述步骤中设置的最大值,这可能是因为在用户登录脚本/etc/profile中使用ulimit-n命令已经将用户可同时打开的文件数做了限制。
由于通过ulimit-n修改系统对用户可同时打开文件的最大数限制时,新修改的值只能小于或等于上次ulimit-n设置的值,因此想用此命令增大这个限制值是不可能的。所以,如果有上述问题存在,就只能去打开/etc/profile脚本文件,在文件中查找是否使用了ulimit-n限制了用户可同时打开的最大文件数量,如果找到,则删除这行命令,或者将其设置的值改为合适的值,然后保存文件,用户退出并重新登录系统即可。
通过上述步骤,就为支持高并发TCP连接处理的通讯处理程序解除关于打开文件数量方面的系统限制。
Linux系统下,TCP连接断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候我们可以优化TCP的内核参数,来及时将TIME_WAIT状态的端口清理掉。
下面介绍的方法只对拥有大量TIME_WAIT状态的连接导致系统资源消耗有效,如果不是这种情况下,效果可能不明显。可以使用netstat命令去查TIME_WAIT状态的连接状态,输入下面的组合命令,查看当前TCP连接的状态和对应的连接数量:
# netstat-n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
这个命令会输出类似下面的结果:
LAST_ACK16 SYN_RECV348 ESTABLISHED70 FIN_WAIT1229 FIN_WAIT230 CLOSING33 TIME_WAIT18098
我们只用关心TIME_WAIT的个数,在这里可以看到,有18000多个TIME_WAIT,这样就占用了18000多个端口。要知道端口的数量只有65535个,占用一个少一个,会严重的影响到后继的新连接。这种情况下,我们就有必要调整下Linux的TCP内核参数,让系统更快的释放TIME_WAIT连接。
编辑配置文件:/etc/sysctl.conf,在这个文件中,加入下面的几行内容:
# vim /etc/sysctl.conf net.ipv4.tcp_syncookies= 1 net.ipv4.tcp_tw_reuse= 1 net.ipv4.tcp_tw_recycle= 1 net.ipv4.tcp_fin_timeout= 30
输入下面的命令,让内核参数生效:
# sysctl-p
简单的说明上面的参数的含义:
在经过这样的调整之后,除了会进一步提升服务器的负载能力之外,还能够防御小流量程度的DoS、CC和SYN攻击。
此外,如果你的连接数本身就很多,我们可以再优化一下TCP的可使用端口范围,进一步提升服务器的并发能力。依然是往上面的参数文件中,加入下面这些配置:
net.ipv4.tcp_keepalive_time= 1200 net.ipv4.ip_local_port_range= 1024 65535 net.ipv4.tcp_max_syn_backlog= 8192 net.ipv4.tcp_max_tw_buckets= 5000
这几个参数,建议只在流量非常大的服务器上开启,会有显著的效果。一般的流量小的服务器上,没有必要去设置这几个参数。
Dabei handelt es sich auch um ein Problem mit dem TCP-Überlastungsalgorithmus. Sie können den folgenden Befehl verwenden, um das von dieser Maschine bereitgestellte Überlastungsalgorithmus-Kontrollmodul anzuzeigen:
Für mehrere Algorithmen Zur Analyse Weitere Informationen finden Sie im Folgenden: Vor- und Nachteile, anwendbare Umgebung und Leistungsanalyse des TCP-Überlastungskontrollalgorithmus. Sie können beispielsweise Hybla für hohe Verzögerungen und den HTTP-Algorithmus für mittlere Verzögerungen usw. ausprobieren.
Wenn Sie den TCP-Überlastungsalgorithmus auf hybla net.ipv4.tcp_congestion_control=hybla einstellen möchten
Darüber hinaus können wir für Kernel-Versionen höher als 3.7.1 tcp_fastopen aktivieren: net.ipv4.tcp_fastopen= 3
Um TCP-Verbindungen mit hoher Parallelität unter Linux zu ermöglichen, müssen Sie bestätigen, ob die Anwendung die entsprechende Netzwerk-E/A-Technologie und den E/A-Ereignisverteilungsmechanismus verwendet. Verfügbare I/O-Technologien sind synchrone I/O, nicht blockierende synchrone I/O und asynchrone I/O. Wenn bei hoher TCP-Parallelität synchrone E/A verwendet wird, wird die Ausführung des Programms ernsthaft blockiert, es sei denn, es wird ein Thread für E/A pro TCP-Verbindung erstellt. Allerdings verursachen zu viele Threads aufgrund der Thread-Planung des Systems einen enormen Overhead. Daher ist es nicht ratsam, synchrone E/A in Situationen mit hoher TCP-Parallelität zu verwenden. In diesem Fall können Sie die Verwendung nicht blockierender synchroner E/A oder asynchroner E/A in Betracht ziehen. Zu den nicht blockierenden synchronen E/A-Technologien gehört die Verwendung von select(), poll(), epoll und anderen Mechanismen. Die Technologie der asynchronen E/A besteht in der Verwendung von AIO.
Aus Sicht des I/O-Ereignis-Dispatch-Mechanismus ist die Verwendung von select() ungeeignet, da es eine begrenzte Anzahl gleichzeitiger Verbindungen unterstützt (normalerweise innerhalb von 1024). Unter Berücksichtigung der Leistung ist poll() ebenfalls ungeeignet. Obwohl es aufgrund seines „Polling“-Mechanismus eine höhere Anzahl von Parallelitäten unterstützen kann, ist seine Betriebseffizienz recht gering, und das kann der Fall sein E/A-Ereignisse sind ungleichmäßig verteilt, was bei einigen TCP-Verbindungen zu einem „E/A-Ausfall“ führt. Wenn Sie epoll oder AIO verwenden, besteht das oben genannte Problem nicht (die frühe Implementierung der AIO-Technologie im Linux-Kernel wurde durch die Erstellung eines Threads im Kernel für jede E/A-Anforderung erreicht. Dieser Implementierungsmechanismus ist bei hohen Anforderungen sehr effektiv gleichzeitige TCP-Verbindungen Es gibt tatsächlich ernsthafte Leistungsprobleme bei der Verwendung, aber im neuesten Linux-Kernel wurde die Implementierung von AIO verbessert.
Zusammenfassend lässt sich sagen, dass Sie bei der Entwicklung von Linux-Anwendungen, die viele gleichzeitige TCP-Verbindungen unterstützen, versuchen sollten, Epoll- oder AIO-Technologie zu verwenden, um die E/A-Steuerung für gleichzeitige TCP-Verbindungen zu erreichen. Dadurch wird die Fähigkeit des Programms verbessert, viele gleichzeitige TCP-Verbindungen zu verarbeiten Bietet effiziente I/O-Garantien.
Nach einer solchen optimierten Konfiguration wird die Fähigkeit des Servers zur gleichzeitigen TCP-Verarbeitung erheblich verbessert. Die obige Konfiguration dient nur als Referenz. Wenn Sie sie in einer Produktionsumgebung verwenden, beachten Sie sie bitte und passen Sie sie entsprechend Ihrer tatsächlichen Situation an.
Das obige ist der detaillierte Inhalt vonOptimierung von Linux-System- und Kernelparametern unter Bedingungen hoher Parallelität. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!