Le processus de surveillance du modèle. Comment limiter le nombre de processus PHP-CGI pour mod_fcgid

Les processus PHP-CGI dévorent la mémoire multipliant dans la progression géométrique et ne veulent pas mourir après la limite FCGIDMAXReQuestSsProcessProcessProcesse, après quoi PHP-CGI commence activement à tout décharger en échange et que le système commence à émettre "502 Mauvaise passerelle. ".

À limiter le nombre de processus PHP-CGIIl ne suffit pas d'installer FCGidMaxReQuestSperProcess, après traitement Quels processus se plieraient, mais pas toujours, ils le font volontairement.

La situation à la douleur est familière lorsque PHP-CGI traite ( enfant) Je serai fronçant, et vous ne les chercherez pas à mourir - ils ne voudront pas vivre ... :) rappelle au problème de la surpopulation de la Terre "Piplam" - n'est-ce pas vrai?;)

Pour résoudre les déséquilibres éternels entre les ancêtres et l'enfant en limitant le nombre d'enfants PHP-CGI, leur temps de vie ( génocide) et le contrôle de leur reproduction ( la contraception).

Restriction du nombre de processus PHP-CGI pour mod_fcgid

Les lignes directrices ci-dessous jouent probablement le plus le rôle principal dans restriction du nombre de processus PHP-CGI Et dans la plupart des cas, les valeurs par défaut contenues ici sont défectueuses pour les serveurs RAM inférieurs à 5-10 Go:

  • Fcgidmaxprocesses 1000. - quantité maximale processus pouvant être actifs simultanément;
  • FCGIDMAXPRESSPERCLASPLASPECESPERCLASS 100. - le nombre maximum de processus dans une classe ( segment), c'est à dire. Le nombre maximum de processus autorisés à générer via le même vescepropre ( wrapper - overclock);
  • FCGIDMINPROCESSPERCLASS 3. - le nombre minimum de processus dans une classe ( segment), c'est à dire. Le nombre minimum de processus lancés via le même vesceproper ( wrapper - overclock), qui sera disponible après avoir terminé toutes les demandes;
  • FcgidMaxReQuestSperProcess 0. - FastCGI doit "jouer dans la boîte" après avoir effectué ce nombre de demandes.

Quoi nombre de processus PHP-CGI Sera le plus optimal? Déterminer le nombre optimal de processus PHP-CGI besoin (pub) Inscrivez-vous sur notre site! :)(/ PUB) (REG) Prenez compte de la quantité totale de RAM et de la taille de la mémoire attribuée aux Phr en mémoire_limit ( php.ini.), qui peut être absorbé par chacun des processus PHP-CGI lors de l'exécution du script RNR. Par exemple, si nous avons 512 Mo, dont 150 à 200 mb sont affectés au système d'exploitation lui-même, 50-100 autres pour le serveur BD, MTA postal, etc., et mémoire_limit \u003d 64, puis dans ce cas à notre 200-250 MB Runs Nous pouvons facilement exécuter 3-4 processus PHP-CGI simultanément. (/ REG)

Paramètres du délai d'attente de processus PHP-CGI

Avec la reproduction active de PHP-CGI d'enfants, en entrant dans le cadre, ils peuvent vivre presque éternellement, et cela est semé de cataclysmes. Vous trouverez ci-dessous une liste des directives GMO qui aideront à couper vie vie pour les processus PHP-CGI Et en temps opportun de libérer leurs ressources:

  • FcgidioTimeout 40. - temps ( en sec.) Au cours de laquelle le module mod_fcgid essaiera d'exécuter le script.
  • Fcgidprocesslifetime 3600. - Si le processus existe plus longtemps cette fois ( en secondes), il devra alors être marqué pour la destruction lors de la prochaine analyse des processus dont l'intervalle est défini dans la directive FCGidiDlesCanInterval;
  • Fcgididletimeout 300. - Si le nombre de processus dépasse le FCGIDMINProcessesperclass, alors un processus qui ne traite pas les demandes au cours de cette période (en secondes), lors de la prochaine numérisation des processus dont l'intervalle est défini dans la directive FCGidiDlesCanInterval sera marquée pour la mise à mort;
  • FcgididlescanInterval 120. - L'intervalle à travers lequel le module mod_fcgid recherchera les processus dépassés des limites FCGIDIDLETIMEOUT ou FCGIDProcesslifeTime.
  • Fcgidbusytimeout 300. - Si le processus est engagé dans le traitement des demandes au cours de cette période ( en sec.), alors au cours de la prochaine analyse, l'intervalle est défini dans FCGIDBUSYScanInterval, un tel processus sera marqué pour la mise à mort;
  • FCGIDBUSYSCANINTERVAL 120. - l'intervalle à travers lequel la numérisation et la recherche de processus utilisés dépassaient la limite de FCGIDBUSYTIMTITOUT;
  • FcgiderrorscanInterval 3. - Intervalle ( en sec.) Par laquelle le module mod_fcgid va tuer les processus d'attente, incl. Et ceux qui ont dépassé FCGiDletiMeTout ou FCGIDProcesslifetime. Le tuer se produit en envoyant le processus de signal SIGTERM et si le processus continue d'être actif, il est tué par le signal SIGKILL.

Il est nécessaire de prendre en compte que le processus dépassait FCGIDIDEMEOUT ou FCGIDBUSYTIMTOOUT peut vivre + plus de temps fcgididlescaninterval ou fcgidbusyscaninterval, à travers lequel elle sera marquée pour la destruction.

ScanInterval-S est préférable d'installer avec une différence de plusieurs secondes., Par exemple, si FCGidiDlesCanInterval 120, puis FCGIDBUSYSCANINTTVAL 117 - I.E. Pour numériser les processus ne s'est pas produit en même temps.

Activité des processus PHP-CGI

Si rien de ce qui précède n'a contribué, c'est incroyable, alors vous pouvez toujours essayer de vaincre l'activité de générer des processus PHP-CGI ...

Outre les limites du nombre de demandes, des processus PHP-CGI et du temps de leur vie, il existe toujours une telle chose que l'activité de la génération de processus d'enfants, qui peuvent être résolues par des directives comme FCGIDSPEWNSCORE, FCGIDTERMINATIONSCORE, FCGIDTIMESCORE et FCGIDSPEWNSPOREUPLIMIT , la traduction de bourgeuine je pense avoir donné le bon ( les valeurs par défaut sont indiquées.): FCGIDSPEWNSPOREUPLIMIT, aucun processus d'application des enfants ne sera généré et que toutes les demandes d'envoi devront attendre que le processus existant soit libre ou aussi longtemps que l'évaluation ( But) Ne tombe pas en dessous de cette limite.

Si ma traduction de la description et la compréhension des paramètres ci-dessus est correcte, il est donc nécessaire de réduire l'activité des processus PHP-CGI, il est nécessaire de réduire la valeur de la directive FCGidspawnscoreeuplimit ou d'augmenter les valeurs FCGidspawneScore et FCGIDTERMinationsCore.

RÉSULTATS

J'espère que j'ai énuméré et mâché en détail la plupart des directives de module mod_fcgid qui aideront restreindre le nombre de PHP-CGI et le temps de leur vieet réduire également la consommation de ressources. Ci-dessous sont terminés configuration MOD_FCGID Pour un serveur d'exploitation réussi avec un processeur de 2500 MHz et 512 Mo de RAM:

Oleg golovsky

Pourquoi avez-vous besoin de plusieurs processus de navigateur? L'architecture multiprocessionnaire augmente la sécurité et la stabilité: si une défaillance se produit quelque part, il ne perdra pas tout le reste.

En fait, la réception avec de nombreux processus a longtemps été utilisée par d'autres navigateurs et beaucoup plus agressivement que Firefox. Par exemple, chrome et tous les étrangers de chrome (opéra moderne, yandex.browser et autres) et peuvent afficher des dizaines de processus en mémoire dans le gestionnaire de tâches si de nombreux onglets sont téléchargés.

Il y a un moment négatif sérieux à cet égard: De nombreux processus peuvent fortement chauffer l'ordinateur faible, et si vous êtes utilisé pour travailler avec un grand nombre d'onglets ou que vous avez installé beaucoup d'extensions, alors "la souche" peut déjà être un PC avec caractéristiques relativement pertinentes.

Firefox crée moins de processus que Chrome?

Comme nous l'avons dit, Mozilla a approché la question avec plusieurs processus beaucoup plus attentivement que le même Google.

Initialement, les développeurs n'ont effectué qu'un seul procédé supplémentaire pour Firefox, où des plugins ont été affichés (à ne pas être confondu avec des extensions), - plugin-conteneur.exe. Ainsi, Firefox est apparu pour la première fois 2 procédés.

Cependant, le temps a été passé et demandé à la société de ne pas toujours céder aux concurrents en termes de stabilité et de sécurité. En conséquence, cette année a été achevée une architecture multiprofessionnelle à longue durée de longue durée de Firefox.

L'avantage de moins de consommation de mémoire Firefox ne perd pas, même s'il utilise son multiropessing au maximum (8 processus CP-8 pour le traitement du contenu)

Partie des utilisateurs stables versions de Firefox Pour la première fois, il était possible d'estimer le multiprofessionnement de cet été depuis Firefox 54. La dernière étape de l'automne était la production d'automne de Firefox 57, qui n'est plus prise en charge. Certaines de ces extensions avaient avant de bloquer le mode multiprofessionnel, forçant Firefox à utiliser un seul processus.

Cependant, avec les processus de Firefox, les choses ne sont toujours pas identiques que le chrome. Si le cerveau Google commence dans des processus distincts littéralement tout et tout (chaque onglet, chaque extension), puis Firefox brise divers éléments en groupes. En conséquence, les processus se révèlent autant que le principal concurrent.

Par conséquent, moins de consommation de mémoire et dans certains cas une charge plus petite sur la CPU. Après tout, un grand nombre de processus dans les navigateurs de chrome peuvent même expédier le processeur le plus faible. Mais Mozilla est finalement arrivé au compromis et, à notre avis, la solution la plus raisonnable.

De plus, Firefox utilise un autre mécanisme d'onglets sur demande contrairement à ce qui est utilisé dans les navigateurs chromés et à base de chrome.

Si ces navigateurs Web sont automatiquement chargés en arrière-plan de l'onglet de la session précédente, le «Fire Fox» ne le rend que lorsqu'il est appliqué (en cliquant sur) sur l'onglet, ne créant ainsi pas de processus inutiles quand ils n'ont pas besoin. Cela contribue également à moins de consommer de ressources.

Comment réduire le nombre de processus Firefox?

En revanche, Mozilla permet de manière pratiquement à l'utilisateur de réglementer le nombre de processus d'utilisation du navigateur.

Vous voyez comment plusieurs processus Firefox.exe accrochent dans le gestionnaire de tâches (ou Firefox.exe * 32 dans le cas de la version 32 bits) et souhaitez les supprimer / désactiver - pas un problème. Ouvrez les paramètres, faites défiler la section «Basic», atteignant la sous-section «Performance»:

Si vous supprimez la case à partir du paramètre "Utiliser les paramètres de performance recommandés", vous configurerez le nombre de processus de traitement.

Le choix offre des options de 1 à 7 processus (si vous avez plus de 8 Go de mémoire, les processus peuvent être proposés plus de 7):

À ce moment, il convient de faire plusieurs clarifications importantes.

Premièrement, nous parlons de processus de traitement du contenu. Si vous spécifiez ici, par exemple, 1 processus, le nombre total de processus de mémoire diminuera, mais une seule copie de Firefox.exe Vous ne recevez toujours pas, car en plus de la teneur en Firefox affiche l'interface pour séparer les processus.

Deuxièmement, une diminution du nombre de procédés est logique sur les ordinateurs ayant une petite quantité de "RAM" et extrêmement faible. À son tour, à un matériel plus ou moins acceptable, la multiropession ne s'aggravera pas de la performance, mais au contraire, y contribuera, même si le prix de la consommation de mémoire accrue.

Y a-t-il des avantages de réduire le nombre de processus?

Si nous parlons de notre propre exemple, alors pour les PC avec 8 Go de RAM initialement proposé 4 processus de traitement. Dans ce cas, lors de l'ouverture d'un grand nombre d'onglets, jusqu'à 7 processus pourraient être affichés.

Lorsque nous définissons le nombre de processus de contenu sur 1, redémarré le navigateur et réapprits sur tous les onglets afin qu'ils ne chargent que 4 processus en mémoire.

Parmi ceux-ci, 3 sont conçus pour le navigateur lui-même et 1 processus uniquement pour le traitement du contenu, et ce dernier est facile à distinguer, car lorsqu'il ouvre un nombre décent d'onglets, il commence à prendre une mémoire beaucoup plus que d'autres:

Dans la Firefox, avec nous, 15 sites différents ont été ouverts. Dans le mode d'origine (7 processus), la consommation totale de la mémoire était d'environ 1,5 Go. Lorsque seulement quatre restent, en somme, ils ont pris environ 1,4 Go (voir Captures d'écran ci-dessus).

Nous avons répété l'expérience à plusieurs reprises, chacun d'entre eux "gagnants" de RAM n'était que de 100 à 150 Mo. Il convient de garder à l'esprit que la productivité du navigateur de la transition vers 1 processus pour le contenu pourrait être réduite. Ainsi, le sens de la réduction du nombre de processus, comme vous pouvez le voir, très petit.

17 déc 2010

Vous pouvez télécharger gratuitement.
Ce matériel est fourni par le site exclusivement à des fins d'information. L'administration n'est pas responsable de son contenu.

Dans cet article, je vais décrire différences principales Apache et Nginx, architecture avant-backend, installation Apache Comme backend et nginx en tant que Frontland. Et aussi, je vais décrire la technologie qui vous permettra d'accélérer le serveur Web: gzip_static + yuicompressor.

Nginx - le serveur est léger; Il commence le nombre spécifié de processus (généralement le nombre de processus \u003d nuclei) et chaque processus du cycle prend de nouvelles connexions, traite le courant. Ce modèle permet de servir un grand nombre de clients. Cependant, avec un tel modèle, il est impossible d'effectuer de longues opérations lors du traitement d'une requête (par exemple, mod_php), car Ceci est essentiellement suspendu au serveur. Avec chaque cycle dans le processus, deux opérations sont effectuées en substance: lire le bloc de données de quelque part, écrivez quelque part. De quelque part et quelque part - il s'agit d'une connexion avec le client, de la connexion à un autre serveur Web ou à un processus FASTCGI, système de fichiers, Tampon en mémoire. Le modèle de fonctionnement est configuré par deux paramètres de base:
travailler_processes - le nombre de processus de course. Généralement défini sur un nombre égal de cœurs de processeur.
le travailleur_connections est le nombre maximum de connexions traitées par un processus. Dépend directement du nombre maximal de descripteurs de fichiers ouverts dans le système (1024 par défaut de Linux).

Apache. - le serveur est lourd (il convient de noter que si vous le souhaitez, il peut être facilement facilité, mais cela ne changera pas son architecture); Il a deux modèles de travail principaux - Préfilicher et travailleur.
Lorsque vous utilisez le modèle Preform Apache, crée un nouveau processus de traitement de chaque demande et ce processus effectue tout le travail: Accepte une demande, génère un contenu, donne à l'utilisateur. Ce modèle est configuré par les paramètres suivants:


Minsparestervers est le nombre minimum de processus sans affaires. Il est nécessaire de commencer à le traiter lors de la demande de demande. Le serveur Web exécutera des processus supplémentaires pour en faire la quantité spécifiée.
Maxsparservers est le nombre maximum de processus suspendus sans affaires. Il est nécessaire de ne pas prendre de mémoire supplémentaire. Le serveur Web va tuer des processus supplémentaires.
Maxclients - Le nombre maximum de clients parallèles servis. Le serveur Web ne lancera pas un nombre de processus plus spécifié.
MaxRequestSperchild est le nombre maximum de demandes qui traitent le processus, après quoi le serveur Web le tuera. Encore une fois, pour sauver la mémoire, parce que La mémoire dans les processus sera progressivement "fuite".

Ce modèle était le seul pris en charge par Apache 1.3. Il est stable, ne nécessite pas de système multithreading, mais consomme beaucoup de ressources et perd légèrement à la vitesse du modèle ouvrier.
Lorsque vous utilisez le modèle Apache travailleur crée plusieurs processus, plusieurs threads dans chacun. Dans ce cas, chaque demande est entièrement traitée dans un flux séparé. Légèrement moins stable que le préforboire, car L'effondrement du flux peut entraîner l'effondrement de l'ensemble du processus, mais cela fonctionne un peu plus vite, consommant moins de ressources. Ce modèle est configuré par les paramètres suivants:

StartServers - Spécifie le nombre de processus en cours lors du démarrage du serveur Web.
Minssparetthreads est le nombre minimum de flux suspendus sans cas dans chaque processus.
MaxspareThreads est le nombre maximum de fils suspendus sans cas dans chaque processus.
Threadsperchild - Spécifie le nombre de threads lancé par chaque processus lors du démarrage du processus.
Maxclients - Le nombre maximum de clients parallèles servis. Dans ce cas, définit le nombre total de threads dans tous les processus.
MaxRequestSperchild est le nombre maximum de demandes qui traitent le processus, après quoi le serveur Web le tuera.

Frontand-backend.

Le principal problème de Apache - un processus distinct est mis en évidence pour chaque demande (au moins un flux), qui parle également de divers modules et consomme beaucoup de ressources. De plus, ce processus sera suspendu à la mémoire jusqu'à ce que le client donne tout le contenu. Si le client a un canal étroit et que le contenu est assez volumineux, il peut prendre beaucoup de temps. Par exemple, le serveur générera du contenu pendant 0,1 seconde, et il sera donné au client 10 secondes, tout ce temps occupant les ressources du système.
Pour résoudre ce problème, l'architecture avant-backend est utilisée. Son essence est que la demande du client vient sur un serveur facile, avec l'architecture de type Nginx (Façande), qui redirige (processus) une demande de serveur lourde (Bekend). Contenu des formulaires Bekend, lui donne très rapidement une façade et libère les ressources système. Frontand met le résultat du travail du backend à sa mémoire tampon et peut le donner longtemps et persistantes (résultat) au client, tout en consommant beaucoup moins de ressources que le backend. De plus, la FACEAND peut traiter indépendamment des fichiers statiques (CSS, JS, images, etc.), un accès de contrôle, une autorisation de contrôle, etc.

Configuration de NGinx (FaKend) + Apache (Bekend)

On suppose que Nginx et Apache sont déjà installés. Vous devez configurer le serveur afin qu'ils ont écouté différents ports. Dans le même temps, si les deux serveurs sont installés sur une machine, le backend est préférable de suspendre sur l'interface de bouclage (127.0.0.1). Dans NGinx, ceci est configuré par la directive de l'écoute:

Dans Apache, il est configuré par la directive de l'écoute:

Écouter 127.0.0.1:81

Ensuite, vous devez spécifier NGinx pour procéder aux demandes de backend. Ceci est fait par la directive Proxy_Pass 127.0.0.1:81;. C'est la configuration minimale entière. Cependant, nous avons indiqué ci-dessus que le retour des fichiers statiques est préférable de charger NGinx. Supposons que nous ayons un site typique sur PHP. Ensuite, nous devons procéder sur Apache uniquement par les demandes des fichiers K.PHP, le traitement de tout le reste sur Nginx (si votre site utilise mod_rewrite, les révoyés peuvent également être effectués sur NGinx, a.htaccess Files Jetez-le). Il est également nécessaire de considérer que la demande du client vient à Nginx, et la demande d'Apache est déjà nginx, l'hôte HTTPS ne sera pas, et l'adresse du client (Remote_addr) Apache déterminera sous 127.0.0.1. L'en-tête d'hôte est facile à remplacer, mais Remote_addr Apache se détermine. Ce problème est résolu avec mod_rpaf pour Apache. Cela fonctionne comme suit: NGinx connaît la propriété intellectuelle du client et ajoute un certain nombre d'en-tête HTTPS (par exemple, X-Real-IP) dans lequel cette IP prescrit. Mod_RPAF reçoit ce titre et prescrit son contenu à la variable Remote_addr Apache. Ainsi, les scripts PHP effectués par Apache verront le vrai client IP.
Maintenant, la configuration deviendra compliqué. Prenez d'abord prendre soin de Nginx, et le même hôte virtuel existait dans Apache, avec la même racine. Exemple pour nginx:

serveur (
Écoutez 80;
Site serveur_name;
root / var / www / site /;
}

Exemple pour Apache:

Site serveurName

Maintenant, définissez les paramètres du schéma décrit ci-dessus:
Nginx:
serveur (
Écoutez 80;
Site serveur_name;
emplacement / (
root / var / www / site /;
Index Index.php;
}
Lieu ~ \\ .php ($ | \\ /) (
proxy_pass https://127.0.0.1:81;
proxy_set_header X-Real-IP $ Remote_addr;
Proxy_set_header hôte $ hôte;
}
}


Apache:

Paramètres Mod_RPAF.
Ruménable sur.
Rpafproxy_ips 127.0.0.1
RPAFHeader X-Real-IP


DocumentOrot "/ var / www / site /"
Site serveurName

Expression régulière \\ .php ($ | \\ /) décrit deux situations: Demande à * .php et demande à * .php / foo / bar. La deuxième option est requise pour le travail de nombreux cms..com / index.php (puisque nous avons défini un fichier d'index) et sera également traité sur Apache.

Accélérer: gzip_static + yuicompresseur

Gzip dans une toile est bonne. Fichiers texte Excellente rétractable, des sauvegardes de trafic, et le contenu est livré plus rapidement à l'utilisateur. Nginx est capable de serrer à la volée, il n'y a donc aucun problème ici. Cependant, un certain temps est passé à la compression du fichier, y compris le processeur. Et ici la directive nginx gzip_statique vient à la rescousse. L'essence de son travail dans ce qui suit: Si le fichier Nginx demande un fichier avec le même nom et la même extension ".gz", par exemple style.css et style.css.gz, puis au lieu de compresser style.CSS, nginx Va lire avec le disque est déjà compressé style.css.gz et le donner sous l'apparence de style compressé.CSS.
Les paramètres Nginx ressembleront à ceci:

https (
...
gzip_static sur;
Gzip sur;
gzip_comp_level 9;
GZIP_TYPES Application / X-JavaScript Texte / CSS;
...

Parfaitement, nous avons généré une fois le fichier .gz afin que Nginx l'ait donné plusieurs fois. Et en plus, nous compresserons CSS et JS à l'aide du compresseur YUI. Cet utilitaire minimise les fichiers CSS et JS que possible en supprimant les espaces, réduisant les noms, etc.
Et pour tout rétrécir automatiquement, vous pouvez également être mis à jour automatiquement avec le cron et un petit script. Écrivez à Cron pour commencer une fois par jour la commande suivante:

Usr / bin / trouva / var / www -mmin 1500 -Name "* .js" -or -Oname "* .CSS" | Xargs -i -n 1 -p 2 packfile.sh

dans le paramètre -p 2, spécifiez le nombre de cœurs de votre processeur, n'oubliez pas d'enregistrer le chemin complet de packfile.sh et de modifier / var / www vers votre répertoire Web.
Dans le fichier packfile.sh, sucer.

C'est le quatrième article de la série "Surmonter les bordures de Windows", dans lequel je parle des restrictions qui existent pour des ressources fondamentales sous Windows. Cette fois, je vais discuter avec vous une limite sur le nombre maximum de threads et de processus supportés par Windows. Ici, je vais décrire brièvement la différence entre le flux et le processus, restreindre le flux d'enquête (à partir de l'anglais. Threau d'enquête), après quoi nous parlerons de restrictions liées aux processus. Tout d'abord, j'ai décidé de parler des restrictions des flux, car chaque processus actif a au moins un flux (le processus terminé, mais la référence à laquelle est stockée dans le gestionnaire fourni par un autre processus, n'a pas de courant). Les restrictions sur les processus dépendent directement des principales limitations associées aux flux.

Contrairement à certaines options pour UNIX, la plupart des ressources Windows ne disposent pas d'une limite fixe posée dans le système d'exploitation à la phase de montage, et plutôt les restrictions sur la base des ressources de base disponibles, que j'ai dit plus tôt. Les processus et les flux, par exemple, exigent mémoire physique, mémoire virtuelle et mémoire de mémoire, de sorte que le nombre de processus et de threads pouvant être créés sur ce système Windows est déterminé par l'une de ces ressources, en fonction de la manière dont ces processus ou flux ont été créés et les restrictions de base des ressources de base être atteint en premier. Par conséquent, je vous recommande de lire mes précédents articles, si vous ne l'avez pas encore fait, car je vous référerai plus loin à de tels concepts que la mémoire réservée, la mémoire allouée et la limite du système de la mémoire, que j'ai parlé dans les articles précédents:

Processus et flux
Le processus Windows est intrinsèquement un conteneur dans lequel le code de commande du fichier exécutable est stocké. Il s'agit d'un objet du processus du noyau et de Windows utilise cet objet d'objet et des structures de données associées pour stocker et maintenir des informations sur le code d'application exécutable. Par exemple, le processus dispose d'un espace d'adressage virtuel dans lequel ses données privées et générales sont stockées et dans lesquelles l'image exécutable et les bibliothèques DLL associées sont affichées. Windows utilisant des outils de diagnostic enregistre des informations sur l'utilisation du processus de ressources pour tenir compte de la comptabilité et de l'exécution des requêtes et des registres Les liens de processus vers les objets du système d'exploitation dans la table descripteur de processus. Les processus fonctionnent avec un contexte de sécurité appelé marqueur qui identifie le compte d'utilisateur, les comptes et les privilèges attribués au processus.

Le processus comprend une ou plusieurs flux qui effectuent réellement le code dans le processus (techniquement, pas des processus, mais des flux) et sont présentés dans le système comme des objets de flux de noyau. Il existe plusieurs raisons pour lesquelles les applications créent des flux en plus de leur flux initial initial: 1) Les processus avec interface utilisateur créent généralement des flux pour effectuer leur travail tout en enregistrant la réactivité du flux principal aux commandes utilisateur associées à la saisie de données et contrôle Windows; 2) Les applications qui souhaitent utiliser plusieurs processeurs pour la mise en œuvre des performances ou qui souhaitent continuer à fonctionner, tandis que les flux arrêtent leur travail, en attente de la synchronisation des opérations d'E / S, créez des flux pour obtenir des avantages supplémentaires à partir d'une opération multi-filetée.

Restrictions de flux
Outre les informations de base des flux, y compris des données sur l'état de statut des registres de la CPU, une priorité et des informations sur l'utilisation du flux de ressources, chaque thread contient une partie de l'espace de processus de l'espace de processus, qui s'appelle la pile que le Le flux peut utiliser comme mémoire de travail dans le déroulement de l'exécution du code de programme, pour transmettre des fonctions, stocker des variables locales et des adresses de fonction des fonctions. Ainsi, pour éviter les déchets irrationnels de la mémoire virtuelle du système, seule une partie de la pile est initialement distribuée, ou une partie de celle-ci est transmise au courant et le résidu est simplement réservé. Étant donné que des piles en mémoire se développent vers le bas, le système place les pages dites "Guard" (à partir des pages de garde anglaises) de la mémoire en dehors de la partie sélectionnée de la pile, qui fournit une sélection automatique. mémoire supplémentaire (appelé l'expansion de la pile) quand elle prend. L'illustration suivante montre comment la zone de pile dédiée est approfondie et comment les pages de garde sont déplacées comme des extensions de pile dans un espace d'adressage 32 bits:

Les structures exécutables portables (PE) d'images exécutables déterminent le volume de l'espace d'adresses, qui est réservé et est initialement mis en surbrillance pour la pile de flux. Par défaut, la liaison se réserve 1 Mo et met en évidence une page (4 Ko), mais les développeurs peuvent modifier ces valeurs ou modifier les valeurs PE lorsqu'elles organisent la communication avec leur programme ou en appelant un flux séparé de la fonction CreeTread. Vous pouvez utiliser l'utilitaire tel que Dumbin, fourni avec Visual Studio pour afficher les paramètres du programme exécutable. Voici les résultats du lancement de Dumbin avec l'option / en-têtes du programme exécutable généré par le nouveau projet Visual Studio:

Transférer des nombres de système hexadécimal Calculus, vous pouvez voir que la taille de la réserve de pile est de 1 Mo, et la zone de mémoire sélectionnée est de 4 Ko; À l'aide d'un nouvel utilitaire Sysinternals appelé MMAP, vous pouvez vous connecter à ce processus et voir son espace d'adressage, et ainsi voir la page de processus initialement dédiée de la pile du processus, le chien de garde et le reste de la mémoire réservée de la pile:

Étant donné que chaque courant consomme une partie de l'espace d'adressage du processus, les processus ont une restriction de base sur le nombre de threads qu'ils peuvent créer, égal à la taille de leur espace d'adressage divisé en taille de la pile de flux.

Restrictions 32 bits
Même si le processus n'avait aucun code, aucune donnée et tout l'espace d'adressage ne pouvait être utilisé sous Stacks, le processus 32 bits avec l'espace d'adressage par défaut dans 2 B pourrait créer un maximum de 2048 flux. Voici les résultats du programme TestLimit exécutant dans Windows 32 bits avec le paramètre -T (création de flux) confirmant la disponibilité de cette restriction:

Encore une fois, dans le cadre de l'espace d'adressage a déjà été utilisé pour le code et la mémoire dynamique initiale, tous les 2 Go étaient disponibles pour des piles de flux, de sorte que le nombre total de flux créés ne pouvait pas atteindre la limite théorique des cours d'eau de 2048.

J'ai essayé de courir testerlimit avec une option supplémentaireFourniture d'un espace d'adresses amélioré d'application, en espérant que s'il donne plus de 2 Go d'espace d'adresses (par exemple, dans des systèmes 32 bits, il est réalisé en exécutant une application avec option / 3 Go ou / userva pour boot.ini ou l'équivalent Option de BCD sur Vista et ultérieurement supérieures à Serve), il l'utilisera. Les processus 32 bits sont alloués 4 Go d'espace d'adressage lorsqu'ils démarrent sur une fenêtre de 64 bits. Combien de flux peut créer un testLimit 32 bits en cours d'exécution sur une fenêtre 64 bits? Si vous développez sur le fait que nous avons déjà discuté, la réponse doit être 4096 (4 Go divisé par 1 Mo), cependant, dans la pratique, ce nombre est nettement inférieur. Voici un testLimit 32 bits en cours d'exécution sur une fenêtre XP 64 bits:

La raison de cette incohérence réside dans le fait que lorsque vous exécutez une application 32 bits sur une fenêtre de 64 bits, elle est en fait un processus de 64 bits qui effectue un code 64 bits pour le compte de threads 32 bits et donc En mémoire pour chaque flux de zones réservées à des piles de flux de 64 bits et 32 \u200b\u200bbits. 256KB est réservé à une pile de 64 bits (les exceptions sont publiées sur Vista dans laquelle taille de la source La pile de flux de 64 bits est de 1 Mo). Étant donné que chaque fil de 32 bits commence son existence en mode 64 bits et la taille de la pile, qui est mise en surbrillance au début, dépasse la taille de la page, dans la plupart des cas, vous verrez qu'au moins 16 Ko se distingue pour un 64- pile de bits de flux. Voici un exemple de piles 32 bits de 64 bits et 32 \u200b\u200bbits (une pile 32 bits est marquée comme "WOW64"):

Un testLimit 32 bits a pu créer dans le flux Windows 3204 64 bits, qui s'explique par le fait que chaque flux utilise 1 Mo + 256 ko d'espace d'adresses sous la pile (je répète, les exceptions sont des versions Windows à Vista, où 1 Mo + 1mb est utilisé). Cependant, j'ai reçu un autre résultat en exécutant 32 bits TestLimit sur Windows 7 de 64 bits:

Différences entre les résultats sur Windows XP et Windows 7 causée par une nature plus promiscueuse du schéma de distribution d'adresse dans Windows Vista., Adressez la randomisation de la mise en page d'espace (ASLR), qui conduit à une fragmentation. La randomisation de la charge DLL, la pile d'écoulement et la mise en place de la mémoire dynamique contribue à améliorer la protection contre les logiciels malveillants. Comme vous pouvez voir l'image suivante du programme VMMAP, dans système de test Il existe également 357 Mo d'espace d'adresse disponible, mais la plus grande unité libre a une taille de 128 Ko, soit moins de 1 Mo, nécessaire pour une pile 32 bits:

Comme je l'ai déjà noté, le développeur peut réinstaller la phase par défaut de la réserve de pile. L'une des raisons possibles de cela peut être le désir d'éviter le flux vain de l'espace d'adressage, lorsqu'il est connu à l'avance que la pile de flux sera toujours utilisée moins que le 1MB par défaut. L'image TestLimit PE utilise la taille de la réserve de pile sur 64 Ko et, lorsque vous spécifiez le paramètre Paramètre -T ensemble, TestLimit crée des flux avec des piles de taille en 64 Ko. Voici le résultat de cet utilitaire sur le système avec Windows XP 32 bits et de 256 Mo de RAM (j'ai spécifiquement passé ce test sur un système faible, qui pour souligner cette restriction):

Il convient de noter ici qu'une autre erreur est survenue, à partir de laquelle il s'ensuit que dans cette situation, la raison n'est pas l'espace d'adressage. En fait, 64 Ko-Stacks doivent fournir environ 32 000 flux (2GB / 64 Ko \u003d 32768). Alors, quelle limitation se manifeste dans ce cas? Si vous regardez des candidats possibles, y compris la mémoire et la piscine allouées, ils ne donnent aucun conseil à cette question, car toutes ces valeurs sont inférieures à leurs limites:

La réponse que nous pouvons trouver dans plus d'informations sur la mémoire dans le noyau Debugger, qui nous indiquera la limite souhaitée associée à la mémoire résiduée disponible, dont le volume total était épuisé:

La mémoire résiduelle disponible est une mémoire physique allouée aux données ou au code qui doit être en RAM. Les dimensions de la piscine non déchargée et des pilotes non jugés sont calculées quel que soit cette option, par exemple, de mémoire réservée dans la RAM pour les opérations d'E / S. Chaque fil a les deux piles du régime utilisateur, je l'ai déjà parlé, mais ils ont également une pile de mode préférée (mode noyau), qui est utilisé lorsque les flux fonctionnent en mode noyau, par exemple, effectuant des appels système. Lorsque le flux est actif, sa pile de noyau est fixée en mémoire. Le flux peut donc effectuer un code dans le noyau pour lequel page requise peut ne pas être absent.

La pile de base du noyau prend 12 Ko dans des fenêtres 32 bits et 24kb dans une fenêtre de 64 bits. 14225 Les threads nécessitent environ 170 Mo de mémoire réelle pour eux-mêmes, ce qui correspond avec précision à la quantité de mémoire libre sur ce système avec TestLimit off:

Dès que la limite de la mémoire du système disponible est obtenue, de nombreuses opérations de base commencent à se terminer par une erreur. Par exemple, voici une erreur que j'ai reçue, en cliquant sur une étiquette deux fois. Internet Explorer.Situé sur le bureau:

Comme prévu, fonctionnant sur une fenêtre de 64 bits avec une RAM de 256 Mo, TestLimit a pu créer 6600 threads - environ la moitié du nombre de flux de cet utilitaire capable de créer dans des fenêtres 32 bits avec une RAM de 256 Mo - avant l'épuisement de la mémoire disponible. :

La raison pour laquelle j'ai déjà utilisé le terme "BASIC" Stack Kernel est qu'un flux qui fonctionne avec des fonctions graphiques et de contrôle de fenêtre obtient une pile "grande" lorsqu'elle exécute le premier défi, dont la taille est égale à (ou plus) 20kb Windows 32 bits et 48 Ko sur une fenêtre 64 bits. TestLimit Les flux ne provoquent pas une seule ape similaire, de sorte qu'ils ont des piles de noyau de base.
Limitations de fils 64 bits

Comme des flux 32 bits, les flux par défaut de 64 bits ont une pile de 1 Mo, mais 64 bits ont beaucoup plus d'espace d'adresses utilisateur (8 To), de sorte que cela ne devrait pas être un problème lorsqu'il s'agit de créer un grand nombre de flux. Et pourtant, il est évident que la mémoire résidente reste un limiteur potentiel. La version 64 bits de TestLimit (testlimit64.exe) a été capable de créer avec un paramètre -n et sans environ 6600 flux sur le système avec une version de Windows XP et 256m de 64 bits, exactement autant que la version 32 bits créée. , parce que la limite a été réalisée la mémoire disponible. Cependant, sur le système avec 2 Go de RAM TestLimit64, seuls 55 000 threads ont pu créer, ce qui est nettement inférieur à la quantité de flux que cet utilitaire pourrait créer si la restriction a été effectuée par la mémoire réelle (2GB / 24KB \u003d 89000):

Dans ce cas, la cause est la pile initiale d'écoulement dédiée, ce qui entraîne le fait que le système termine la mémoire virtuelle et une erreur associée à un manque de volume de fichier de pagination apparaît. Dès que la quantité de mémoire allouée atteint la taille de la RAM, la vitesse de création de nouveaux threads est considérablement réduite, car le système commence à "glisser", les piles de flux créés précédemment commencent à être déchargées dans le fichier de pagination pour libérer Espace pour les piles de nouveaux threads et le fichier de pagination devrait augmenter. Avec le paramètre activé -n, les résultats sont les mêmes, car la quantité initiale de mémoire de pile allouée reste la même.

Restrictions de processus
Le nombre de processus supportés par Windows devrait évidemment être inférieur au nombre de flux, car chaque processus a un flux et en soi, le processus conduit à une consommation de ressources supplémentaire. Un testLimit 32 bits, en cours d'exécution sur un système avec Windows XP 64 bits et 2 Go de mémoire système crée environ 8400 processus:

Si vous regardez le résultat du travail du débogueur du noyau, il devient clair que, dans ce cas, la restriction de la mémoire réelle est obtenue:

Si le processus a utilisé la mémoire disponible de la résidence pour accueillir uniquement une pile du flux de mode privilégié, TestLimit pourrait créer beaucoup plus de 8400 flux sur le système à partir de 2 Go. Le nombre de mémoire résident sur ce système sans lancement de testLimit est de 1,99 Go:

En divisant le volume de la mémoire résiduée utilisée par TestLimit (1,99 Go), le nombre de processus créés par celui-ci nous obtenons que 230 Ko de mémoire résident est donnée à chaque processus. Étant donné que la pile de noyau 64 bits prend 24 Ko, nous obtenons que nous manquons environ 206 Ko pour chaque processus. Où est le reste de la résidence utilisée? Lorsque le processus est créé, Windows se réserve une quantité suffisante de mémoire physique pour fournir un ensemble de travail minimum (à partir de l'anglais. Ensemble de travail). Ceci est fait afin de garantir le processus que toute situation à sa disposition sera une quantité suffisante de mémoire physique pour enregistrer cette quantité de données requise pour assurer le bureau minimum des pages. Par défaut, la taille de l'ensemble de pages de travail est souvent 200KB, qui peut être facilement vérifiée en ajoutant le jeu de travail minimum dans la fenêtre Explorateur de processus:

Les 6kb restants sont une mémoire réelle allouée à une mémoire légère supplémentaire (de l'anglais. Mémoire non adaptée) dans laquelle le processus lui-même est stocké. Le processus en Windows 32 bits utilise un peu moins que la résidence, car sa pile de flux privilégié est moins.

Comme dans le cas d'une pile de flux de mode utilisateur, les processus peuvent remplacer la taille de la figure de collecte de la page installée par défaut à l'aide de la fonction SETProcessworkingSetSIsize. TESTLIMIT prend en charge le paramètre -N, qui, dans un ensemble avec le paramètre -p, vous permet d'installer pour les processus de filiale du processus principal testlimit la taille minimale possible de l'ensemble de pages de travail égal à 80kb. Étant donné que les processus d'enfants ont besoin de temps pour réduire leurs ensembles de travail de pages, le testlimit ne peut plus créer de processus, suspend le travail et essaie de continuer, ce qui lui donne une chance d'être exécuté. TestLimit, démarré avec le paramètre -N sur le système avec Windows 7 et 4 Go de RAM, en a une autre mesure de la mémoire disponible de la mémoire disponible, la limite est limitée par la mémoire système dédiée:

Au bas du bas, vous pouvez voir que le débogueur du noyau rapporte non seulement que la limite de la mémoire système allouée a été réalisée, mais que, après avoir atteint cette restriction, il y a eu mille erreurs d'allocation de mémoire, à la fois virtuelles et mémoire. et la mémoire, dédiée sous le pool déchargé (la limite de la mémoire système sélectionnée a été réellement obtenue plusieurs fois, puisque lorsqu'une erreur s'est produite lorsqu'une erreur s'est produite associée à un manque de volume de fichier de pagination, ce volume a augmenté, poussant cette restriction):

Avant de lancer un testLimit, le niveau moyen de la mémoire sélectionnée était d'environ 1,5 Go, de sorte que les flux occupaient environ 8 Go de mémoire sélectionnée. Par conséquent, chaque processus a consommé environ 8 GB / 6600 ou 1,2B. Le résultat de l'exécution de la commande! VM Kernel Debugger, qui montre la distribution de sa propre mémoire (à partir de l'anglais. Mémoire privée) Pour chaque processus, confirme la fidélité de ce calcul:

La quantité initiale de mémoire allouée sous la pile d'écoulements décrite précédemment a un léger impact sur les demandes restantes de la mémoire requise pour les structures de données d'espace de données de l'espace de processus, des entrées de la table de page, des descriptions de descripteurs, des objets de traitement et de l'écoulement. propres données que le processus crée lors de son initialisation.

Combien de processus et de ruisseaux suffiront-ils?
Ainsi, répond aux questions "Combien de threads prend en charge les fenêtres?" Et "combien de processus pouvez-vous heurter simultanément sur Windows?" Nous sommes interdépendants. En plus des nuances de méthodes sur lesquelles les flux déterminent la taille de leur pile et de leurs processus déterminent leur ensemble de pages de travail minimum, deux facteurs principaux qui déterminent les réponses à ces questions pour chaque système spécifique sont la quantité de mémoire physique et la limitation de la mémoire système allouée. En tout état de cause, si l'application crée un nombre suffisant de threads ou de processus à approcher ces années, son développeur devrait réviser le projet de cette demande, car ils existent toujours diverses méthodes Atteindre le même résultat avec un nombre raisonnable de processus. Par exemple, l'objectif principal lors de la mise à l'échelle d'une application est le désir de sauvegarder le nombre de threads fonctionnant égal au nombre de CPU, et l'un des moyens d'atteindre cela consiste en la transition de l'utilisation des opérations d'E / S synchrones à l'aide de l'utilisation asynchrone. Les ports d'achèvement, qui doivent aider à conserver le nombre de threads d'exécution avec le processeur numérique.

Il n'est pas secret que le développement de presque aucun système automatisé Démarre avec la définition du format des données d'entrée et de sortie. Les données peuvent différer de manière significative dans leur structure et leur organisation. Certains peuvent avoir plusieurs liaisons, d'autres représentent simplement un tableau de types de données simples.

Nous nous intéressons principalement à deux approches de stockage et de travail avec les données SQL et NOSQL.

Sql (Langue de requête structurée) - Langue des requêtes structurées utilisées pour créer, modifier et gérer des données dans bases relationnellesah des données basées sur modèle relationnel Les données. Je pense que cela ne devrait pas s'attaquer à la prise en compte de la même adresse approche en détail, car c'est le premier à faire face à quiconque lors de l'étude de bases de données.

Nosql (Non seulement SQL, non seulement SQL) - Un certain nombre d'approches visant à mettre en œuvre des modèles de base de données ayant des différences significatives de langue SQLcaractéristique des bases de données relationnelles traditionnelles.

Terme Nosql Eric Evans a été inventé lorsque Joan Oskarson de Last.fm souhaitait organiser un événement pour discuter de bases de données ouvertes distribuées.

Le concept NOSQL n'est pas un déni complet de la langue SQL et du modèle relationnel. NOSQL est un outil important et utile, mais pas un outil universel. L'un des problèmes de bases de données relationnelles classiques est difficile lorsque vous travaillez avec les données d'un très grand volume et de systèmes à chargement élevé. L'objectif principal de NOSQL est d'élargir les capacités de la base de données où SQL n'est pas suffisamment flexible, ne fournit pas de productivité dû et ne le supprime pas où elle répond aux exigences d'une tâche.

En juillet 2011, Couchbase, le développeur CouchDB, Memcached et Membase, a annoncé la création d'une nouvelle langue de requête de type SQL - UNQL (langage de requête de données non structuré). Les travaux sur la création d'une nouvelle langue ont été réalisés par le créateur de SQLite Richard Hipp (Richard Hipp) et le fondateur du projet Couchdb Damien Katz (Damien Katz). Développement transféré dans la communauté en tant que domaine public

L'utilisation de l'approche NOSQL nous utilisera pour stocker d'énormes tableaux d'informations simples non structurées, ce qui ne nécessite pas de communication avec d'autres données. Un exemple de ces informations peut être une liste de caches ou des fichiers image multi-millions. Dans le même temps, nous obtiendrons un gain important gagnant par rapport à l'approche relationnelle.

Systèmes NOSQL

Nosql SGBM

Déterminer avec les concepts.

Évolutivité - Répartition automatique des données entre plusieurs serveurs. Ces systèmes que nous appelons des bases de données distribuées. Ils comprennent Cassandra, Hbase, Riak, Scalaris et Voldemort. Si vous utilisez la quantité de données qui ne peuvent pas être traitées sur une machine ou si vous ne souhaitez pas gérer la distribution manuellement, c'est ce dont vous avez besoin.

L'attention devrait être portée aux choses suivantes: Prise en charge de plusieurs centres de données et la possibilité d'ajouter de nouvelles machines à un cluster de travail transparent à vos applications.

Ajout de la machine transparente au cluster

Prise en charge de plusieurs centres de données

Il est nécessaire de modifier le fichier

Les bases de données non attribuées incluent: Couchdb, Mongodb, Neo4j, Redis et Tokyo. Cabinet. . Ces systèmes peuvent être utilisés comme "couche" pour les systèmes distribués.

Modèle de données et de demande

Il existe un grand nombre de modèles de données et de demandes d'API aux bases de données NOSQL.

Modèle de données

Demandes API

Colonne familiale

Documentation

Colonne familiale

Documentation

Collections

Documentation

Hachage imbriqués, repos

Valeur clé

Valeur clé

Valeur clé

La famille de colonnes de colonnes (famille de colonnes) est utilisée à Cassandra et HBASE. Dans les deux systèmes, vous avez des lignes et des colonnes, mais le nombre de lignes n'est pas grand: chaque ligne a un nombre variable de colonnes et de colonnes ne doit pas être définie à l'avance.

Le système clé / valeur est simple et n'est pas compliqué dans la mise en œuvre, mais pas efficace si vous êtes intéressé par la demande ou la mise à jour, seule une partie des données. Il est également difficile de mettre en œuvre des structures complexes sur les systèmes distribués de ce type.

Les bases de données orientées de documents sont essentiellement le niveau suivant de systèmes de clé / de valeur, vous permettant d'associer des données imbriquées avec la clé. La prise en charge de ces demandes est plus efficace que de simplement retourner la valeur entière.

Neo4J a un modèle de données unique qui décrit des objets sous forme de nœuds et de bords du graphique. Pour les requêtes correspondant à ce modèle (par exemple, données hiérarchiques), les performances peuvent être supérieures à plusieurs commandes de grandeur que pour les options alternatives.

Scalaris est unique en termes d'utilisation de transactions distribuées entre plusieurs clés.

Système de stockage

Ceci est une forme dans laquelle les données sont présentées dans le système.

Type de données

MEMTABLE / SSTABLE.

APPEND-UNIQUEMENT B-TREE

MEMTABLE / SSTABLE sur HDFS

Liste liée sur disque

En mémoire avec instantanés de fond

Pluggable (principalement BDB mysql)

Le système de stockage peut vous aider lors de l'évaluation des charges.

Les systèmes qui stockent les données en mémoire sont très, très rapides, mais ne peuvent pas fonctionner avec des données dépassant la taille de la RAM disponible. La sécurité de ces données en cas de défaillance ou de panne de courant peut être un problème. La quantité de données pouvant s'attendre à des enregistrements sur peut être très grande. Certains systèmes, tels que Scalaris, décident ce problème Utilisation de la réplication, mais Scalaris ne prend pas en charge la mise à l'échelle dans plusieurs centres de données.

MEMTABLES / SSTABLE TAMPER Demandes de saisie de mémoire (MEMTABLE) et après l'enregistrement ajouté au journal. Après avoir accumulé un nombre suffisant d'enregistrements, le mémorable est trié et écrit sur le disque comme sstable. Cela permet de réaliser des performances proches de la performance de la RAM, en même temps, supprimez-vous des problèmes pertinents lorsqu'ils sont stockés uniquement en mémoire.

Les arbres B sont utilisés dans des bases de données pendant très longtemps. Ils fournissent un soutien fiable à l'indexation, mais les performances, lorsqu'elles sont utilisées sur des machines avec des disques durs magnétiques, sont très faibles.
Intéressant est d'utiliser dans Couchdb B-Trees, uniquement avec la fonction d'ajout (ANNEX-ANS-ARBES B), ce qui vous permet d'obtenir de bonnes performances lorsque vous écrivez des données sur le disque. Il est réalisé par le fait que l'arbre binaire n'a pas besoin d'être reconstruit lors de l'ajout d'un article.

Une considération séparée mérite un projet Memcached qui est devenu un progéniteur pour de nombreux autres systèmes.

Memcached - logiciel Mettre en cache des données dans RAM du serveur en fonction du paradigme de la table de hachage. Il s'agit d'un système distribué de haute performance pour les objets de mise en cache dans la RAM, destiné aux systèmes Internet haut chargé.

La table de hachage est une structure de données qui implémente une interface de tableau associative qui vous permet de stocker des paires (clé, de la valeur) et effectuer trois opérations: le fonctionnement de l'ajout d'une nouvelle paire, de la recherche et de la suppression du fonctionnement de la paire par clé.

Avec la bibliothèque cliente Memcached Vous permet de caresser des données dans la RAM à partir d'une pluralité de serveurs disponibles. La distribution est mise en œuvre par segmentation des données sur la valeur de la clé de la clé par analogie avec les sachets de la table HASH. La bibliothèque cliente à l'aide de la clé de données, calcule le hachage et l'utilise pour sélectionner le serveur approprié. La situation de la défaillance du serveur est traitée comme une cache Miss, ce qui vous permet d'augmenter la tolérance de défaut du complexe en augmentant le nombre de serveurs memcaches et la capacité de produire leur remplacement chaud.

Memcached a de nombreuses modifications développées dans le cadre de plusieurs projets: MyCached, Membase, Memcache, Memcacheq, Memcachedb et Libmemated .

Le projet central, la locomotive du concept NOSQL - MEMCACHED. L'un des moins importants MemQached est que le cache lui-même est un lieu de stockage très peu fiable. Éliminez cet inconvénient et sont appelés Solutions supplémentaires: MemCachedb et Membase. Au niveau de l'interface (API), ces produits sont entièrement compatibles avec Memcached. Mais ici, avec les dotifars des données, ils sont réinitialisés au disque (stratégie de point de contrôle DB). Dans ce formulaire, ils constituent un exemple éclatant de "bases de données non relationnelles" - des systèmes persistants (à long terme) de stockage de données distribuées sous forme de vapeur "de la valeur clé".

Le prochain produit basé sur Memcached - Memcacheq. Il s'agit d'un système de file d'attente de message qui utilise une API très simplifiée de Memcached. MemCacheq forme une pile nommée dans laquelle vous pouvez enregistrer vos messages et que les données elles-mêmes sont stockées physiquement dans la base de données BERKELEYDB (similaire à MEMCACHEDB), par conséquent, la conservation est assurée, la possibilité de réplication, etc.

Libmemated est une bibliothèque de clients bien connue écrite en C ++ pour travailler avec le protocole mémached standard.

Toutes les installations de stockage non relationnelles réalisées sous la forme d'un système distribué et de paires de «valeur de clé» stockées peuvent être divisées en deux types: stables et instables. Durable (par exemple, MEMCACHEDB, MEMBASE, HYPERTABLE) - Écrivez des données sur le disque, assurant ainsi leur sécurité en cas de défaillance. Instable (Memcached classique) - Conservez des clés dans la mémoire volatile et ne garantit pas leur sécurité. Les stockages instables sont justifiés d'utiliser la mise en cache et une charge réduite sur l'écurie - dans ce cas, il existe leurs obligations inextricables et l'avantage principal.

Le stockage durable est déjà une base de données à part entière nosqls combinant la vitesse du memcached et vous permettant de stocker des données plus complexes.

Régime frontal + backend

Le schéma le plus courant dans lequel le rôle frontal est un serveur Web rapide et facile (par exemple Nginx) et Apache fonctionne comme un backend.

Regardons les avantages d'un tel schéma sur l'exemple. Imaginez que le serveur Web Apache a besoin de servir environ 1000 demandes en même temps, et bon nombre de ces clients sont connectés à Internet le long des canaux de communication lente. Dans le cas de l'utilisation d'Apache, nous recevrons 1000 processus httpd, chacun d'entre eux hébergera la RAM et cette mémoire sera occupée jusqu'à ce que le client reçoive le contenu demandé ou que l'erreur ne se produise pas.

Si le schéma Backend Frontend + est appliqué, une fois que la demande du client est arrivée, le Nginx transmet la demande Apache et reçoit rapidement la réponse. Et dans le cas du contenu statique (HTML, images, fichiers de cache, etc.) NGinx formera une réponse sans déranger Apache. Si nous devons toujours exécuter la logique (script PHP), Apache après l'a fait et a donné la réponse nginx libère la mémoire, puis avec le client interagit le serveur Web NGINX, qui est simplement conçu pour distribuer du contenu statique, un grand nombre de clients, avec une consommation mineure de ressources système. Dans un compartiment de mise en cache compétent, nous obtenons des économies colossales des ressources du serveur et le système qui peut être appelé très chargé.

Chevaux de travail

Apache - Optimisation des performances

Pour le Schéma FRONTEND + Backend, Apache ne coûte pas un coût aussi net, mais si vous avez une route chaque heure du processeur de microsecondes et chaque octet de la RAM, cette question devrait alors être versée à ce problème.

Le moyen le plus "raide" consiste à augmenter les performances du serveur - mettre un (s) processeur (s) plus intelligent (s) et plus de mémoire, mais nous allons passer à un chemin moins radical pour commencer. Nous accélérerons le travail d'Apache en optimisant sa configuration. Il existe des configurations qui ne peuvent être appliquées que lorsque Apache se rebellant, d'autres peuvent être appliquées sans recompiler le serveur.

Charger uniquement les modules nécessaires

La plupart des fonctions Apache sont implémentées à l'aide de modules. Dans ce cas, ces modules peuvent être à la fois "cousus" dans l'un ou l'autre ensemble et chargé comme bibliothèques dynamiques (DSO). La plupart des distributions modernes fournissent Apache avec un ensemble DSO, de sorte que les modules inutiles puissent être désactivés sans recompilation.

En réduisant le nombre de modules, vous réduisez la quantité de mémoire consommée. Si vous décidez de compiler Apache vous-même, approchez-vous minutieusement la liste des modules que vous souhaitez activer ou les compiler en tant que DSO à l'aide d'APCHE1 et APXS2 dans Apache2. Pour désactiver les modules DSO inutiles, il suffit de commenter des lignes de chargement inutiles dans httpd.conf. Si vous compilez les modules statiquement, Apache consommera un peu moins de mémoire, mais vous devez le recompiler à chaque fois pour désactiver ou compléter un ou plusieurs module.

Choisissez un MPM approprié.

Pour traiter la demande dans Apache, le processus ou le flux est mis en surbrillance. Ces processus fonctionnent conformément à l'un des MPM (modèle multiprocesseur). La sélection MPM dépend de nombreux facteurs, tels que la présence de support pour les flux du système d'exploitation, la quantité de mémoire libre, ainsi que les exigences de stabilité et de sécurité.

Si la sécurité dépasse, sélectionnez Peruser ou Apache-ITK. Si une performance plus importante, faites attention au préforce ou au travailleur.

Nom

Développeur

Système d'Exploitation pris en charge

La description

Objectif

Apache Software Foundation

Multiprocesseur hybride et modèle multiple. Garder la stabilité des solutions multiprocesseurs, il vous permet de servir un grand nombre de clients ayant une utilisation minimale de ressources.

Serveurs Web à charge moyenne.

Stable.

Apache Software Foundation

MPM basé sur la création préliminaire de processus individuels qui n'utilisent pas le mécanisme de threads.

Sécurité et stabilité accrues dues à l'isolement des processus les uns des autres, économisant la compatibilité avec les anciennes bibliothèques qui ne supportent pas les threads.

Stable.

Apache Software Foundation

Modèle hybride, avec un nombre fixe de processus.

Serveurs à charge élevée, la possibilité de démarrer les processus d'enfants en utilisant un autre nom d'utilisateur pour améliorer la sécurité.

Dans le développement, instable.

Apache Software Foundation

Modèle multiple optimisé pour travailler dans l'environnement NetWare.

Serveurs Novell NetWare

Stable.

Apache Software Foundation

Microsoft Windows.

Modèle de multiplicateur créé pour le système d'exploitation Microsoft Windows.

Serveurs exécutant Windows Server.

Stable.

Steinar H. Gunderson

MPM basé sur le modèle de préfours. Permet le lancement de chaque hôte virtuel sous Uid et GID individuels.

Serveurs d'hébergement, serveurs, essentiels à l'isolement de l'utilisateur et à la comptabilité des ressources.

Stable.

Sean Gabriel HeaCock.

Modèle créé sur la base de Perchild MPM. Permet le lancement de chaque hôte virtuel sous Uid et GID individuels. N'utilise pas de flux.

Fournir une sécurité accrue, travaillant avec des bibliothèques ne supportant pas les threads.

Apache La végéticulation est nécessaire pour modifier MPM. Il est plus pratique pour cela de prendre la distribution à la source.

RECHERCHE DNS.

La directive HostNamelookUps inclut les demandes DNS inverse, tandis que les hôtes DNS client sont écrits dans les journaux au lieu des adresses IP. Cela ralentit considérablement le traitement de la demande, car La demande ne sera pas traitée tant que la réponse du serveur DNS est reçue. Regardez que cette directive est toujours désactivée (Hostnamelookups Off). Si des adresses DNS sont nécessaires, vous pouvez "conduire" le journal dans l'utilitaire de Logresolve.

De plus, assurez-vous que les adresses IP sont utilisées pour permettre et nier de directives et non noms de domaine. Sinon, Apache fera deux demandes DNS (inverse et direct) pour apprendre l'IP et vous assurer que le client est validé.

Autoriser Override

Si la directive Alloverride n'est pas installée dans aucune, Apache essaiera d'ouvrir des fichiers.htaccess dans chaque répertoire qu'il visite et dans tous les répertoires au-dessus de celui-ci. Par example:

DocumentationRoot / Var / www / html

Allowoverride tout.

Si elle est demandée /index.html, Apache tentera d'ouvrir (et d'interpréter) les fichiers /.htaccess, /var/.htaccess, / var / www / hassess, et / var / www / html / .htaccess. Évidemment, il augmente le temps de traitement de la requête. Donc, si vous avez besoin.htacte uniquement pour un répertoire, laissez-la seulement pour elle:

DocumentationRoot / Var / www / html

AllowoverRide aucun.

Allowoverride tout.

Succulllinks et SymlinkInSIPOWERMATCH

Si l'option FUNDMLINKS est activée pour le répertoire, Apache suivra les liens symboliques de ce répertoire. Si l'option SymlinkSifOWNOWERCHATCH est activée, Apache suivra uniquement les liens symboliques uniquement si le propriétaire du fichier ou du répertoire auquel ce lien indique, le propriétaire du répertoire spécifié. Par conséquent, lorsque l'option Apache SymlinkSifowerMerchatch Apache est activée, il faut plus de demandes de système. De plus, des demandes de système supplémentaires sont nécessaires lorsque suissollinks n'est pas définie. Par conséquent, le plus optimal des performances comprendra l'option Fixeymlinks, bien sûr, si la stratégie de sécurité le permet.

Contenu Négociatio.

Le mécanisme défini dans la spécification HTTP qui vous permet de servir diverses versions Document (présentation des ressources), pour la même URI, de sorte que le client puisse déterminer quelle version est mieux cohérente avec ses capacités. Lorsque le client envoie une demande au serveur, elle indique au serveur, quels types de fichiers qu'il comprend. Chaque type correspond à une note décrivant la manière dont le client le comprend. Ainsi, le serveur est capable de fournir la version de la ressource qui est le mieux conforme aux besoins du client.

Il n'est pas difficile de comprendre ce qu'il menace pour les performances du serveur, évitez donc d'utiliser la négociation de contenu.

Les clients de Max

La directive MaxClients définit le nombre maximal de demandes parallèles que le serveur prendra en charge. La valeur maxclient ne doit pas être trop petite, sinon, de nombreux clients seront refusés. Il est impossible d'installer trop - cela menace le manque de ressources et la "goutte" du serveur. Approximativement, maxclients \u003d nombre de mémoire sélectionné pour le serveur Web / taille maximum processus ou débit généré. Pour les fichiers Apache statiques, il utilise environ 2-3 Mo au processus de parole (PHP, CGI) - dépend du script, mais généralement d'environ 16-32 Mo. Si le serveur servait déjà de maximum de demandes, de nouvelles demandes tombent dans la file d'attente, dont la taille est définie par la directive EcoledackLog.

MINSPARESERVERS, MAXSPERESTERVERS ET STARTSERVERS

Créer un flux, et surtout le processus est une opération à forte intensité de ressources, alors Apache les crée sur la réserve. MAXSPARESERVERS ET MINSPARESERVERS Directives Définissez le nombre minimum et maximum de processus / flux qui doivent être préparés pour accepter la demande. Si la valeur MINSPARESTERVERS est trop peu peu importante et vient de nombreuses demandes, Apache commencera à créer de nombreux nouveaux processus / flux, ce qui créera une charge excessive dans les moments de pointe. Si MAXSPARESERVERS est trop volumineux, Apache chargera inutilement le système, même si le nombre de demandes est minime.

Une manière expérimentée doit être traitée avec de telles valeurs afin que Apache ne crée pas plus de 4 processus / flux par seconde. Si elle est créée plus de 4, l'enregistrement correspondant sera effectué dans ErrorLog - le signal du fait que les minsparvers doivent être agrandis.

MaxRequestSperchild

La directive MaxRequestSsPerchild détermine le nombre maximal de demandes qu'un processus d'enfant / flux peut être traité avant de finir. Par défaut, la valeur est définie sur 0, ce qui signifie qu'il ne sera jamais terminé. Il est recommandé d'installer MaxRequestSperchild égal au nombre de demandes par heure. Cela ne créera pas de charge excédentaire sur le serveur et, en même temps, vous aidera à vous débarrasser des problèmes de fuite de mémoire dans les processus enfants (par exemple, si vous utilisez une version PHP instable).

Keepalive et KeepAliveTimeout.

Keepalive vous permet de faire plusieurs demandes dans une connexion TCP. Lors de l'utilisation du Schéma Backend Frontend +, ces directives ne sont pas pertinentes.

Compression HTTP

Maintenant, tous les clients modernes et presque tous les serveurs prennent en charge la compression HTTP. L'utilisation de la compression vous permet de réduire le trafic entre le client et le serveur jusqu'à 4 rounds, augmentant ainsi la charge sur le processeur de serveur. Mais si le serveur visit de nombreux clients avec des canaux lents, la compression est capable de réduire la charge en réduisant le temps de transmission de la réponse comprimée. Dans le même temps, les ressources prises par la filiale sont exemptées plus rapidement et le nombre de demandes simultanées est réduit. Ceci est particulièrement perceptible en termes de limite de mémoire.

Je note qu'il ne faut pas établir un rapport de compression GZIP sur 5, car la charge sur le processeur augmente de manière significative et que le rapport de compression augmente légèrement. En outre, vous ne devez pas compresser les fichiers dont le format implique déjà compression - il s'agit de presque tous les fichiers multimédia et les archives.

Caching côté client

N'oubliez pas d'installer Expire les en-têtes pour des fichiers statiques (module mod_exprires). Si le fichier ne change pas, vous devez toujours donner une indication au client à zéro. Dans le même temps, le client chargera rapidement des pages et le serveur se débarrassera des demandes inutiles.

Éteindre les bûches

Désactiver les journaux permet de faire face temporairement à la charge dans les moments de pointe. Cette mesure réduit considérablement la charge sur tous les types de logiciels et constitue un moyen universel dans une situation critique. Naturellement, avec des inconvénients évidents, il ne peut être recommandé d'utiliser et ne sert que une solution temporaire au problème.

Nginx

Un serveur Web simple et facile spécialement conçu pour gérer les requêtes statiques. La cause de ses performances est que les flux de travail servent simultanément plusieurs connexions, les multiplexant en appelant le système d'exploitation Select, Epoll (Linux) et KQueue (FreeBSD). Le serveur dispose d'un système de gestion de la mémoire efficace utilisant des pools. La réponse au client est formée dans des tampons qui stockent des données en mémoire ou indiquent un segment du fichier. Les tampons sont combinés dans des chaînes qui déterminent la séquence dans laquelle les données seront transmises au client. Si le système d'exploitation prend en charge des opérations d'E / S efficaces, telles que rallonçon et Envoyer le fichier. T. Nginx, Si possible, applique-les.

Lorsqu'il est utilisé en conjonction avec Apache, Nginx est configuré pour traiter la statique et est utilisé pour équilibrer la charge. Le délai imparmé est engagé uniquement par ce qui donne du contenu statique, cela le rend très rapidement et avec des coûts généraux minimaux.

Lightpd.

"Server Web développé en calculant la vitesse et la valorisation, ainsi que la conformité aux normes." - Wikipédia

C'est une alternative à Nginx et est appliquée aux mêmes objectifs.

Accélérateurs php.

Le principe de fonctionnement de ces produits est qu'ils cachent le code de script d'octet et vous permettent de réduire la charge de l'interprète PHP.

Solutions existantes

Le cache PHP alternatif a pris une conception, comme un cadre libre, ouvert et stable pour la mise en cache et l'optimisation du code source PHP. Prend en charge PHP4 et PHP5, dont 5,3.

eracelerator est un projet ouvert gratuit qui effectue également les rôles de l'accélérateur, de l'optimiseur et du déballage. Il a des fonctions intégrées de la mise en cache de contenu dynamique. Il est possible d'optimiser les scripts PHP. Prend en charge PHP4 et PHP5, dont 5,3.

Accélérateur de script PHP PHPExpress PHP sur un serveur Web. Fournit également la prise en charge du téléchargement de fichiers codé via NU-Coder. Prend en charge PHP4 et PHP5, dont 5,3

XCache prend en charge PHP4 et PHP5, dont 5,3. À partir de la version 2.0.0 (candidature de version à partir de 2012-04-05) a permis une prise en charge de PHP 5.4.

Extension de cache Windows pour accélérateur PHP - PHP pour Microsoft IIS (licence BSD). Prend en charge uniquement PHP (5.2 et 5.3).

Logique de cache

"Cash, cache et mettre en cache à nouveau!" - Voici la devise du système de chargement élevé.

Imaginons le site parfait à haute chargement. Le serveur reçoit une demande HTTP du client. Frontend correspond à une demande avec un fichier physique sur le serveur et, s'il existe, le donne. Chargement de scripts et d'images pour omettre, car c'est pour la plupart des statiques et est donnée au même principe. En outre, si le fichier physiquement n'existe pas, FronTend fait appel à cette demande au backend-y, qui est engagée dans le traitement de la logique (scripts PHP, etc.). Le backend devrait décider si cache cette demande Et créer un fichier dans un certain endroit, qui sera donné la dernière fois. Ainsi, nous avons toujours soudé cette demande et le serveur le traitera le plus rapidement possible avec la charge minimale possible sur le serveur.

Cet exemple idéal convient aux pages, dont le contenu ne change pas dans le temps, ni rarement change. En pratique, nous avons des pages dont le contenu peut changer avec chaque demande ultérieure. Plutôt, une partie de ce contenu. Un exemple de tels contenus peut servir d'informations d'utilisateur à modifier avec un délai invisible ou à afficher en temps réel (mise à jour pour chaque redémarrage de la page). Nous avons ici une tâche qui se présente à la séparation des données dynamiques et statiques sur la page.

La voie la plus pratique et la plus répandue de diviser les données est la division de la page à blocs. Ceci est logique et pratique, car la page, du point de vue de la mise en page, consiste en blocs. Dans ce cas, il ne sera pas possible d'éviter la logique dans ce cas, mais cette logique sera traitée avec les plus petits coûts.

Ainsi, la demande du client (à l'exception de la demande statique) est redirigée vers le backend et son traitement est réduit aux actions suivantes:

  1. Recevoir des informations sur les blocs qui seront sur la page.
  2. Vérification des informations sur les caches pour chaque bloc. L'argent peut ne pas exister ou doit être mis à jour. Dans ce cas, nous générons un fichier de cache. Si le bloc ne doit pas être mis en cache, effectuez la logique appropriée. Les informations de cache peuvent être stockées dans la base de données NOSQL ou dans la structure de fichiers. Cette exigence est une chose: obtenir ces informations devraient prendre le minimum de ressources.
  3. Formant pages HTML. Les blocs construits sont construits à l'aide des instructions SSI (un lien vers le fichier de cache est inséré), ce qui permettra de sauvegarder de manière significative la mémoire.
  4. La page tombe sur le frontend, qui remplace toutes les instructions SSI sur le contenu des fichiers et donne à la page au client.

De plus, le répit est mis en cache des résultats de la méthode de la fonction ou de la classe. Dans le même temps, nous transmettons la fonction de cache à la référence d'objet (si vous appelez la méthode), le nom de la méthode ou de la fonction (s'il s'agit d'une fonction globale) et des paramètres destinés à cette méthode ou à cette fonction. La fonction de mise en cache vérifiera la présence d'un fichier de cache, si nécessaire, la formera ou la lire, puis renvoyer le résultat.

il description générale Principe de fonctionnement d'un site à grande charge. Mise en œuvre spécifique Il sera distingué par des détails, mais le concept restera le même.

Photos, Piccchi, poches

Il s'avère que l'image peut aussi être mise en cache. Pourquoi? Tu demandes. En principe, après le téléchargement sur le serveur, nous avons déjà un fichier que FronTend sera épargné rapidement si nécessaire. Mais souvent, nous devons avoir une image différente basée sur les images déjà disponibles (par exemple, d'autres tailles). Supposons que nous ayons besoin d'une image miniature - Thumbnail (Snorg Habide). Dans ce cas, il suffit que nous formions un chemin vers le fichier le plus pauvre de la photo réduite et donnez à la page au client.

  1. Le client, ayant reçu le code source de la page, commence à charger des statiques et se réfère à la demande d'inexistante tandis que la photo du frontend-y.
  2. Frontend transmettra des demandes d'images inexistantes sur le backend.
  3. Backend analyse la requête génère le fichier image et donne des données binaires avec l'en-tête HTTP correspondant.
  4. Toutes les demandes suivantes recevront un frontend.
Avez-vous aimé l'article? Partager avec des amis: