Die Leistungsparameter von Linux-Servern

步履不停
Freigeben: 2019-07-02 16:28:01
Original
3108 Leute haben es durchsucht

Die Leistungsparameter von Linux-Servern

Wenn ein Server auf Basis des Linux-Betriebssystems läuft, werden auch verschiedene Parameterinformationen dargestellt. Im Allgemeinen reagieren Betriebs- und Wartungspersonal sowie Systemadministratoren äußerst sensibel auf diese Daten, aber diese Parameter sind auch für Entwickler sehr wichtig, insbesondere wenn Ihr Programm nicht ordnungsgemäß funktioniert. Diese Hinweise können häufig dabei helfen, Probleme schnell zu lokalisieren und zu verfolgen.

Hier sind nur einige einfache Tools zum Anzeigen der relevanten Parameter des Systems. Natürlich funktionieren viele Tools auch durch die Analyse und Verarbeitung von Daten unter /proc und /sys sowie für eine detailliertere und professionellere Leistungsüberwachung Für die Optimierung benötigen Sie möglicherweise auch professionellere Tools (Perf, Systemtap usw.) und Technologie. Schließlich ist die Überwachung der Systemleistung selbst ein universitäres Fach.

Die Leistungsparameter von Linux-Servern

1. CPU- und Speicherkategorien

1.1 oben

➜ ~ oben

Die Leistungsparameter von Linux-Servern

Die drei Werte nach der ersten Zeile sind die durchschnittliche Belastung des Systems in den letzten 1, 5 und 15 Jahren Die Last weist einen Aufwärts-, Stabilitäts- und Abwärtstrend auf. Wenn dieser Wert die Anzahl der ausführbaren CPU-Einheiten überschreitet, bedeutet dies, dass die CPU-Leistung gesättigt ist und zu einem Engpass geworden ist.

Die zweite Zeile zählt die Aufgabenstatusinformationen des Systems. Es ist unnötig zu erwähnen, dass die Ausführung natürlich auch diejenigen umfasst, die auf der CPU ausgeführt werden, und solche, deren Ausführung geplant ist. Der Ruhezustand ist normalerweise eine Aufgabe, die auf den Abschluss eines Ereignisses (z. B. einer E/A-Operation) wartet, und die Unterteilung kann unterbrechbare und unterbrechungsfreie Typen umfassen. Gestoppt ist etwas, das angehalten wird. Aufgaben senden normalerweise SIGSTOP oder drücken Strg-Z auf eine Vordergrundaufgabe, um sie anzuhalten. Obwohl Ressourcen automatisch wiederverwendet werden, wenn der Prozess beendet wird, muss auf den Aufgabendeskriptor zugegriffen werden, der die Exit-Aufgabe enthält Diese Art von Prozess wird als nicht mehr gültig angezeigt, unabhängig davon, ob der übergeordnete Prozess vorzeitig beendet wurde oder nicht aufgerufen wurde. Wenn ein solcher Prozess auftritt, sollte besonders darauf geachtet werden, ob das Programm so gestaltet ist falsch. Die dritte Zeile der CPU-Nutzung weist je nach Typ die folgenden Situationen auf:

 ● (us) Benutzer: Die Zeit, die die CPU im Benutzermodus mit niedrigem Nice-Wert (hoher Priorität) (nice

 ● (sy) System: Die Zeit, die die CPU im Kernelmodus des Betriebssystems verbringt Aufrufe (Systemaufrufe) fallen vom Benutzermodus in den Kernel-Status, um bestimmte Dienste auszuführen. Normalerweise ist der Wert kleiner, aber wenn die vom Server ausgeführten E/A intensiver sind, ist der Wert größer

 ● ( ni ) Nice: Die Zeit, die die CPU mit niedriger Priorität im Benutzermodus mit hohem Nice-Wert (niedrige Priorität) (nice>0) verbringt. Standardmäßig wird der neu gestartete Prozess nice=0 hier nicht berücksichtigt, es sei denn, der Nice-Wert des Programms wird manuell über renice oder setpriority() geändert.

● (id) empty: CPU befindet sich im Ruhezustand ( Kernel wird ausgeführt. Zeit, die vom Leerlauf-Handler in Anspruch genommen wird

● (wa) iowait: Zeit, die beim Warten auf den Abschluss von E/A verbraucht wird

● (hi) irq: Zeit, die das System mit der Verarbeitung von Hardware-Interrupts verbringt

● (si) Softirq: Die Zeit, die das System benötigt, um Softirqs, Tasklets (eigentlich ein Sonderfall der ersteren) und Arbeitswarteschlangen zu verarbeiten Die Zeit wird hier schließlich gezählt. Die Ausführung von Warteschlangen erfolgt nicht mehr im Interrupt-Kontext

 ● (st) stehlen: Dies ist im Fall einer virtuellen Maschine sinnvoll, da die CPU unter der virtuellen Maschine liegt teilt auch die physische CPU, sodass dieser Zeitraum darauf hinweist, dass die virtuelle Maschine auf die Planung durch den Hypervisor wartet. CPU-Zeit bedeutet auch, dass der Hypervisor die CPU für die Ausführung während dieses Zeitraums für andere CPUs einplant und die CPU-Ressourcen während dieses Zeitraums „gestohlen“ werden ". Dieser Wert ist auf meinem KVM-VPS-Rechner nicht 0, sondern liegt nur in der Größenordnung von 0,1. Kann man damit feststellen, ob der VPS überbucht ist?

Hohe CPU-Auslastung bedeutet oft etwas, was auch entsprechende Ideen zur Fehlerbehebung bietet, wenn die CPU-Auslastung des Servers zu hoch ist:

1 Wenn die Benutzerauslastung zu hoch ist, liegt das normalerweise an einer Person Zu diesem Zeitpunkt ist es einfach, das Programm über top zu finden. Wenn Sie den Verdacht haben, dass das Programm abnormal ist, können Sie die Hot-Calling-Funktion mithilfe von perf finden weitere Untersuchung;

2. Wenn die Systembelegungsrate zu hoch ist und viele E/A-Vorgänge (einschließlich Terminal-E/A) vorhanden sind, kann dies dazu führen, dass dieser Teil der CPU eine hohe Belegungsrate aufweist, z. B. in der Datei Server, Datenbankserver und andere Servertypen, andernfalls (z. B. >20 %) Es ist sehr wahrscheinlich, dass einige Teile des Kernels und der Treibermodule Probleme haben

3 hoch, es handelt sich normalerweise um ein absichtliches Verhalten, wenn der Initiator des Prozesses weiß, dass die CPU einen hohen Wert einnimmt, um sicherzustellen, dass die CPU-Nutzungsanforderungen anderer Prozesse nicht überflutet werden >

4. Wenn die Belegung von Iowait zu hoch ist, bedeutet dies normalerweise, dass die E/A-Betriebseffizienz einiger Programme sehr gering ist oder die Leistung des entsprechenden E/A-Geräts so gering ist, dass die Lese- und Schreibvorgänge lange dauern zu vervollständigen;

5. Wenn die IRQ-/Softirq-Auslastung zu hoch ist, liegt wahrscheinlich ein Problem mit einigen Peripheriegeräten vor, was zu einer großen Anzahl von IRQ-Anfragen führt. proc/interrupts-Datei, um das Problem herauszufinden;

6. Wenn die Auslastungsrate zu hoch ist, hat die virtuelle Maschine des skrupellosen Herstellers sie überverkauft!

Die vierte und fünfte Zeile sind die Informationen zum physischen Speicher und zum virtuellen Speicher (Swap-Partition): Gesamt = frei + verwendet + Buff/Cache. Jetzt werden die Puffer und die zwischengespeicherten Mem-Informationen summiert, aber Puffer und zwischengespeichert

Mems Beziehung ist in vielerlei Hinsicht unklar. Durch den Vergleich der Daten sind diese beiden Werte tatsächlich die Felder Buffers und Cached in /proc/meminfo: Buffers ist ein Block-Cache für Raw-Festplatten, der hauptsächlich die Metadaten des Dateisystems (z. B. Superblock-Informationen) zwischenspeichert , usw.) in Form eines Rohblocks, dieser Wert ist im Allgemeinen relativ klein (ca. 20 MB); er wird zum Lesen und Zwischenspeichern bestimmter Dateien verwendet, um die Effizienz des Dateizugriffs zu erhöhen das Dateisystem.

Und avail Mem ist ein neuer Parameterwert, der angibt, wie viel Speicherplatz einem neu geöffneten Programm ohne Auslagerung gegeben werden kann, was in etwa frei + buff/cached entspricht, und dies wird auch bestätigt Laut Die obige Aussage, frei + Puffer + zwischengespeicherter Mem, ist der tatsächlich verfügbare physische Speicher. Darüber hinaus ist die Verwendung einer Swap-Partition nicht unbedingt eine schlechte Sache, daher ist die Verwendung der Swap-Partition kein schwerwiegender Parameter, aber häufiges Ein-/Auslagern ist keine gute Sache. Diese Situation erfordert Aufmerksamkeit und weist normalerweise auf einen Mangel an physischem Speicher hin.

Schließlich ist die Ressourcennutzungsliste jedes Programms aufgeführt, wobei die CPU-Auslastung die Summe der Nutzung aller CPU-Kerne ist. Wenn top ausgeführt wird, liest das Programm selbst normalerweise eine große Anzahl von /proc-Vorgängen, sodass das top-Programm selbst im Grunde zu den besten gehört.

Obwohl top sehr leistungsfähig ist, wird es normalerweise für die Echtzeitüberwachung von Systeminformationen auf der Konsole verwendet. Es ist jedoch nicht für die Überwachung von Systemlastinformationen über einen längeren Zeitraum (Tage oder Monate) geeignet Gleichzeitig werden auch kurzlebige Prozesse übersehen und können nicht ausgegeben werden.

1.2 vmstat

vmstat ist neben top ein weiteres häufig verwendetes Systemerkennungstool. Der folgende Screenshot zeigt die Systemlast, als ich Boost mit -j4 kompilierte.

Die Leistungsparameter von Linux-Servern

r stellt die Anzahl der ausführbaren Prozesse dar, und die Daten sind ungefähr konsistent. b stellt die Anzahl der unterbrechungsfreien Prozesse dar. swpd stellt die Menge des verwendeten virtuellen Speichers dar Im Einklang mit top-Swap hat der Wert von -used eine Bedeutung, und wie im Handbuch angegeben, ist die Anzahl der zwischengespeicherten Mem-Puffer im Allgemeinen in der Größenordnung von 20 MB Anzahl der pro Sekunde empfangenen und an die Festplatte gesendeten Daten; in im Systemfeld wird die Anzahl der Systeminterrupts pro Sekunde angegeben (einschließlich Taktinterrupts) und cs gibt die Anzahl der durch verursachten Kontextwechsel an Prozessumschaltung.

Apropos: Ich denke, dass viele Leute beim Kompilieren des Linux-Kernels Probleme damit hatten, ob der -j-Parameter CPU Core oder CPU Core+1 war? Durch Ändern des obigen Parameterwerts -j zum Kompilieren von Boost und Linux-Kernel bei gleichzeitiger Aktivierung der vmstat-Überwachung haben wir festgestellt, dass sich der Kontextwechsel in beiden Fällen grundsätzlich nicht geändert hat und erst nach einer erheblichen Erhöhung des Werts -j der Kontextwechsel erheblich zunimmt. Es scheint unnötig, dass ich zu sehr von diesem Parameter besessen bin, obwohl ich die spezifische Kompilierungszeit noch nicht getestet habe. Die Informationen besagen, dass, wenn es sich nicht im Systemstart- oder Benchmark-Status befindet, etwas mit dem Programm mit dem Parameter context switch>100000 nicht in Ordnung sein muss.

1.3 pidstat

Wenn Sie einen Prozess umfassend und gezielt verfolgen möchten, gibt es nichts Geeigneteres als pidstat – Stackspace, Seitenfehler, aktive und passive Umschaltung und andere Informationen werden fundus erfasst. Der nützlichste Parameter dieses Befehls ist -t, der detaillierte Informationen zu jedem Thread im Prozess auflisten kann.

-r: Seitenfehler und Speicherauslastung treten auf, wenn das Programm auf eine Seite zugreifen muss, die im virtuellen Speicherbereich zugeordnet ist, aber noch nicht in den physischen Speicher geladen wurde Fehler. Der Typ ist

minflt/s, was sich auf geringfügige Fehler bezieht, wenn die physische Seite, auf die zugegriffen werden muss, aus bestimmten Gründen (z. B. gemeinsam genutzte Seiten, Cache-Mechanismen usw.) bereits vorhanden ist. ), es ist nur in der Seitentabelle des aktuellen Prozesses vorhanden. Die MMU muss nur den entsprechenden Eintrag festlegen Fehler: Die MMU muss eine freie physische Seite im aktuell verfügbaren physischen Speicher beantragen (Wenn keine freien Seiten verfügbar sind, müssen Sie andere physische Seiten in den Auslagerungsbereich verschieben, um die freien physischen Seiten freizugeben) und dann Daten laden Die Außenseite in die physische Seite und den entsprechenden Eintrag festlegen. Diese Kosten sind ziemlich hoch. Es gibt mehrere Unterschiede auf Datenebene zu den vorherigen

-s: Stapelnutzung, einschließlich des von StkSize reservierten Stapelplatzes der Thread und der tatsächlich von StkRef verwendete Stapelspeicherplatz. Verwenden Sie ulimit -s, um herauszufinden, dass der Standard-Stack-Speicherplatz unter CentOS 6.x 10240 KB beträgt, während die Standard-Stack-Speicherplatzgröße unter CentOS 7.x und der Ubuntu-Serie 8196 KB beträgt

Die Leistungsparameter von Linux-Servern

-u: CPU-Auslastung, die Parameter ähneln den vorherigen

-w: Die Anzahl der Thread-Kontextwechsel, aufgrund von auch in cswch/s unterteilt Warten auf Ressourcen usw. Statistiken zum aktiven Umschalten aufgrund von Faktoren und zum passiven Umschalten aufgrund der Thread-CPU-Zeit von nvcswch/s

Es wird sehr mühsam sein, wenn Sie die PID des Programms jedes Mal zuerst über ps abrufen und dann Betreiben Sie den Pidstat, also ist dies der Killer -C Sie können eine bestimmte Zeichenfolge angeben. Wenn der Befehl diese Zeichenfolge enthält, werden die Programminformationen gedruckt und gezählt. -l kann den vollständigen Programmnamen und die Parameter anzeigen ➜ ~ pidstat -w -t -C "ailaw" - l

Es scheint, dass pidstat beim Anzeigen einer einzelnen Aufgabe, insbesondere mit mehreren Threads, besser ist als das häufig verwendete ps!

1.4 Sonstiges

Wenn Sie die Situation einer einzelnen CPU separat überwachen müssen, können Sie zusätzlich zu htop auch mpstat verwenden, um zu überprüfen, ob die Arbeitslast jedes Kerns auf dem SMP-Prozessor hoch ist Lastausgleich und ob bestimmte Hotspot-Threads den Kern belegen. ➜ ~ mpstat -P ALL 1

Wenn Sie die von einem Prozess belegten Ressourcen direkt überwachen möchten, können Sie top -u taozj verwenden, um andere benutzerunabhängige Prozesse herauszufiltern, oder Sie können die folgende Methode verwenden, um select, ps Der Befehl kann die zu druckenden Eintragsinformationen anpassen:

while :; do ps -eo user,pid,ni,pri,pcpu,psr,comm | ; erledigt

Wenn Sie die Vererbungsbeziehung klären möchten, können Sie den folgenden häufig verwendeten Parameter verwenden, um die Prozessbaumstruktur anzuzeigen. Der Anzeigeeffekt ist viel detaillierter und schöner als pstree

➜ ~ ps axjf

2 , Disk IO class

iotop kann intuitiv die Echtzeit-Festplattenleserate jedes Prozesses und Threads anzeigen; lsof kann nicht nur die Öffnung anzeigen Informationen zu normalen Dateien (Benutzer), aber auch zum Betrieb von /dev/sda1 Diese Art von Informationen zum Öffnen von Gerätedateien. Wenn die Partition beispielsweise nicht ausgehängt werden kann, können Sie lsof verwenden, um den Nutzungsstatus der Festplattenpartition herauszufinden und hinzuzufügen Mit dem Parameter +fg kann zusätzlich auch die Dateiöffnungsmarkierung angezeigt werden.

2.1 iostat

➜ ~ iostat -xz 1

Tatsächlich sind die wichtigen Parameter für die Festplatte unabhängig davon, ob Sie iostat -xz 1 oder sar -d 1 verwenden:

avgqu-s: Die durchschnittliche Länge der Warteschlange für an das Gerät gesendete E/A-Anfragen. Bei einer einzelnen Festplatte zeigt ein Wert > 1 die Gerätesättigung an, außer bei logischen Festplatten mit mehreren Festplatten-Arrays

await( r_await, w_await): durchschnittliche Wartezeit (ms) für jede Geräte-E/A-Anforderungsoperation, einschließlich der Summe der Zeit, die die Anforderung in die Warteschlange stellt und bedient

svctm: Die an das Gerät gesendete E/A-Anfrage ist die durchschnittliche Servicezeit (ms). lang und die Festplattenreaktion ist schlecht;

%util: Die Nutzung des Geräts gibt den Anteil der E/A-Arbeitszeit pro Sekunde an. Wenn %util>60 %, verringert sich die Leistung einer einzelnen Festplatte. Dies spiegelt sich in der Erhöhung des Wartens wider). Schlecht, es wirkt sich nicht unbedingt auf die Reaktion der Anwendung aus. Der Kernel verwendet normalerweise die asynchrone E/A-Technologie und verwendet Lese- und Schreib-Caching-Technologie, um die Leistung zu verbessern. Dies wird jedoch durch die oben genannten physischen Speicherbeschränkungen eingeschränkt.

Die oben genannten Parameter sind auch für Netzwerkdateisysteme nützlich.

3. Netzwerkkategorie

Die Bedeutung der Netzwerkleistung für den Server ist offensichtlich. Das Tool iptraf kann die Sende- und Empfangsgeschwindigkeitsinformationen des Netzwerks intuitiv anzeigen Karte, wodurch der Vergleich einfach und bequem ist. Ähnliche Durchsatzinformationen können auch über sar -n DEV 1 abgerufen werden. Netzwerkkarten sind standardmäßig mit Informationen zur maximalen Rate ausgestattet, z. B. 100-M-Netzwerkkarten und Gigabit-Netzwerkkarten, sodass dies einfach ist Überprüfen Sie die Geräteauslastung.

Normalerweise ist bei der Netzwerkentwicklung nicht die Übertragungsrate der Netzwerkkarte am wichtigsten, sondern die Paketverlustrate, die Neuübertragungsrate, die Netzwerkverzögerung und andere Informationen der spezifischen UDP- und TCP-Verbindungen.

3.1 netstat

➜ ~ netstat -s

Zeigt die Gesamtdateninformationen jedes Protokolls seit dem Systemstart an. Obwohl die Parameterinformationen relativ umfangreich und nützlich sind, kann der kumulative Wert erst ermittelt werden, wenn die Differenz zwischen zwei Läufen verwendet wird, um die Netzwerkstatusinformationen des aktuellen Systems zu erhalten, oder Sie können eine Uhr verwenden, um den numerischen Änderungstrend zu visualisieren. Daher wird Netstat normalerweise zum Erkennen von Port- und Verbindungsinformationen verwendet:

netstat –all(a) –numeric(n) –tcp(t) –udp(u) –timers(o) –listening(l) –program(p)
Nach dem Login kopieren

–Timer können die umgekehrte Abfrage des Domainnamens abbrechen und die Anzeigegeschwindigkeit beschleunigen. Die am häufigsten verwendeten sind

➜ ~ netstat -antp #Alle TCP-Verbindungen auflisten

➜ ~ netstat -nltp #Alle lokalen TCP-Listening-Sockets auflisten, den Parameter -a nicht hinzufügen

3.2 sar

sar Dies Das Tool ist so leistungsstark, dass es alles von der CPU über die Festplatte bis zum Seitenaustausch steuern kann. Das hier verwendete -n wird hauptsächlich zur Analyse von Netzwerkaktivitäten verwendet, obwohl das Netzwerk auch die Daten verschiedener Protokolle auf verschiedenen Ebenen aufschlüsselt , IP, ICMP und SOCK-Informationen, wir kümmern uns nur um TCP und UDP. Die folgenden Befehle zeigen nicht nur das Senden und Empfangen von Segmenten und Datagrammen unter normalen Umständen an, sondern auch

TCP ➜ ~ sudo sar -n TCP,ETCP 1

aktiv/s: TCP-Verbindung wird lokal initiiert, beispielsweise durch connect(), der TCP-Status ändert sich von GESCHLOSSEN ->

passiv/s: TCP-Verbindung wird remote initiiert, beispielsweise durch Accept (), TCP-Statusänderungen von LISTEN -> verloren geht, erfolgt ein Neuübertragungsvorgang gemäß dem Bestätigungsneuübertragungsmechanismus von TCP

isegerr/s(tcpInErrs): Fehlerpakete werden jede Sekunde empfangen (z. B. Prüfsummenfehler)

UDP ➜ ~ sudo sar -n UDP 1

noport/s(udpNoPorts): Anzahl der pro Sekunde empfangenen Datagramme, aber am angegebenen Zielport befindet sich keine Anwendung

idgmerr/s(udpInErrors) : Zusätzlich zu den oben genannten Gründe, die Anzahl der empfangenen, aber nicht zustellbaren Datagramme

Natürlich können diese Daten die Netzwerkzuverlässigkeit bis zu einem gewissen Grad veranschaulichen, sie können jedoch nur mit bestimmten Geschäftsnachfrageszenarien kombiniert werden.

3.3 tcpdump

tcpdump muss als eine gute Sache bezeichnet werden. Wir alle wissen, dass wir beim lokalen Debuggen gerne Wireshark verwenden, aber was sollen wir tun, wenn ein Problem mit dem Online-Server auftritt?

Die Referenz im Anhang gibt eine Idee: Stellen Sie die Umgebung wieder her und verwenden Sie tcpdump zum Erfassen von Paketen. Wenn das Problem erneut auftritt (z. B. wenn das Protokoll angezeigt wird oder ein bestimmter Status angezeigt wird), kann die Paketerfassung beendet werden und tcpdump Es verfügt über den Parameter -C/-W, der die Größe der erfassten Paketspeicherdatei begrenzen kann. Wenn diese Grenze erreicht ist, werden die gespeicherten Paketdaten automatisch rotiert, sodass die Gesamtzahl der erfassten Pakete kontrollierbar ist. Danach können Sie die Datenpakete von der Leitung nehmen und sie mit Wireshark nach Belieben anzeigen. Wäre das nicht lustig? Obwohl tcpdump keine GUI-Schnittstelle hat, ist seine Paketerfassungsfunktion überhaupt nicht schwach. Sie können verschiedene Filterparameter wie Netzwerkkarte, Host, Port, Protokoll usw. angeben. Die erfassten Pakete sind vollständig und haben Zeitstempel, also das Paket Auch die Analyse von Online-Programmen ist so einfach.

Das Folgende ist ein kleiner Test. Es ist zu erkennen, dass Chrome beim Start automatisch den Aufbau von drei Verbindungen zum Webserver initiiert. Da der dst-Port-Parameter hier eingeschränkt ist, wird das Antwortpaket vom Server gefiltert Nehmen Sie es heraus und öffnen Sie es mit Wireshark. Der Vorgang des Verbindungsaufbaus über SYNC und ACK ist immer noch sehr offensichtlich! Wenn Sie tcpdump verwenden, müssen Sie die Erfassungsfilterbedingungen so weit wie möglich konfigurieren. Dies erleichtert einerseits die spätere Analyse, andererseits wirkt sich dies auf die Leistung der Netzwerkkarte und des Systems aus. Dies wirkt sich wiederum auf die Leistung von Online-Diensten aus.

Die Leistungsparameter von Linux-ServernWeitere Linux-Artikel finden Sie in der Spalte

Linux-Tutorial

, um mehr zu erfahren!

Das obige ist der detaillierte Inhalt vonDie Leistungsparameter von Linux-Servern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!