当前位置:网站首页>Résumé de la technologie de dépannage des goulets d'étranglement des performances du système

Résumé de la technologie de dépannage des goulets d'étranglement des performances du système

2022-01-15 02:29:36 Danny... Idea


Comment résoudre le goulot d'étranglement du système?

Il ne devrait pas être facile de trier les goulets d'étranglement du système.,Une analyse distincte est nécessaire pour différents systèmes de conception..

Tout d'abord, un système entièrement disponible devrait avoiruiInterface(L'accent est mis ici sur un ensemble complet,Systèmes disponibles,Plutôt qu'un seul système de moyenne portée),Le système est divisé en modules avant et arrière.Ici, parce que mon domaine d'expertise personnel est plus dans les modules d'arrière - plan,Je vais donc analyser les goulets d'étranglement du système à partir de l'arrière - plan..

Ici, je combinenginx+tomcat+redis+mysqlCes architectures communes sont analysées:
Insérer la description de l'image ici

Demande d'entrée
Toutes les demandes entrent dans le Service d'arrière - plan,La première chose à considérer est:

Facteur de largeur de bande:

Supposons qu'il y ait200mLe trafic vers le serveur est également demandé,Mais la bande passante n'est que1m,Ainsi, la réception de ce lot de données consomme environ200sLe temps.
La largeur de bande peut être comprise comme la quantité totale de trafic demandée d'une extrémité à l'autre dans un délai déterminé . Et le calcul de la largeur de bande du réseau local et du réseau étendu est en fait différent ,

Serveurulimit

Habituellement, nous utilisons des serveurs en ligne centosSérie, Voici une liste de centos7Configuration pertinente du système:
ulimitConfiguration
Afficher le nombre maximum de fichiers ouverts autorisés par le serveur (linux Les concepts de conception sont documentés dans le système )
D'habitude, si notre java Le programme doit être élargi socket Nombre de liens pour ,Peut être ajustéulimit À l'intérieur.openParamètres à configurer.

[root@izwz9ic9ggky8kub9x1ptuz ~]# ulimit -a | grep open
open files                      (-n) 1000

Afficher le nombre maximum de processus pour l'utilisateur

[root@izwz9ic9ggky8kub9x1ptuz ~]# ulimit -a | grep user
max user processes              (-u) 7284

La configuration pertinente est stockée dans /etc/security/limits.confDans le document.

Configuration de certains paramètres du noyau du système

Dans certains scénarios de stress , Nous prévoyons souvent de telles erreurs :

apr_socket_recv: Connection reset by peer (54)

En général, cette situation est due à certains paramètres de protection à l'intérieur du système ,Ajustements nécessaires/etc/sysctl.conf Paramètres connexes dans le fichier:

net.ipv4.tcp_syncookies = 0
# Lorsque le nombre de demandes concurrentes dépasse 1000Après, Le serveur lui - même peut penser avoir reçu synInondations, Mais pour les systèmes à haute concurrence , Pour désactiver ce paramètre 

net.ipv4.tcp_max_syn_backlog
#Les paramètres déterminentSYN_RECV Nombre de files d'attente d'état ,En général, la valeur par défaut est512Ou1024, C'est - à - dire au - delà de cette quantité , Le système n'acceptera plus de nouveaux TCPDemande de connexion, Empêche en partie l'épuisement des ressources du système . Cette valeur peut être augmentée au besoin pour accepter d'autres demandes de connexion .

net.ipv4.tcp_tw_recycle
# Les paramètres déterminent si l'accélération TIME_WAITDesocketsRecyclage,Par défaut0.

net.ipv4.tcp_tw_reuse
# Les paramètres déterminent si TIME_WAITStatutsocketsPour les nouveauxTCPConnexion,Par défaut0.
 
net.ipv4.tcp_max_tw_buckets
#Parameter DeterminationTIME_WAITStatutsocketsTotal, Peut être défini en fonction du nombre de connexions et des besoins en ressources du système . 

Les paramètres de précaution peuvent également être modifiés comme suit: :

cd /proc/sys/net/ipv4
echo "0" > tcp_syncookies

Généralement utilisé dans les entreprises nginx Faire une demande de réception , Puis l'équilibrage de la charge est transmis .Innginx Il y aura plusieurs configurations de paramètres de base dans la couche :
Nombre maximum de connexions, Accès simultané maximum .

# Spécifiez le même ip Le nombre de demandes est limité à 10Une fois
 limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_conn perip 10;

TomcatAnalyse partielle

Tomcat Prise en charge de trois méthodes de traitement des demandes reçues :BIO、NIO、APR .

1、BioComment,Type de blocageI/O L'opération utilise la tradition Java I/OFonctionnement,Tomcat7Par défaut, les versions suivantes sontbioMode de fonctionnement,Parce que chaque demande crée un thread pour traiter,Les frais généraux du fil sont élevés,Impossible de gérer des scénarios à forte concurrence, L'énergie neutre est également la plus faible dans les trois modes

2、NioComment,- Oui.Java SE 1.4Et une nouvelle version deI/OMode de fonctionnement(C'est - à - dire:java.nioPaquets et sous - paquets),Est basé sur un tampon、Et peut fournir non - blocageI/OFonctionnementJava API,Il a plus que la traditionI/OFonctionnement(bio)Amélioration des performances de fonctionnement simultanées.tomcat 8 Version et au - dessus par défaut nioMode

3、aprMode:Simple compréhension, Est de résoudre l'asynchrone au niveau du système d'exploitation IOQuestions, Améliorer considérablement les performances de traitement et de réponse du serveur , C'est aussiTomcat Mode préféré pour les applications à haute concurrence . Il est un peu plus difficile d'activer ce mode , Quelques bibliothèques dépendantes doivent être installées , EtaprL'essence est d'utiliserjniLa technologie appelle le système d'exploitation sous - jacentIOInterface,Donc vous devez installer les dépendances nécessaires à l'avance, Tout d'abord, il faut installer opensslEtapr

tomcat Réglage des paramètres de connexion
Intomcat Il y a un paramètre de configuration classique :

<Connector port="80" maxHttpHeaderSize="8192"
    maxThreads="4000" minSpareThreads="1000" maxSpareThreads="2000"
    enableLookups="false" redirectPort="8443" acceptCount="2000"
    connectionTimeout="20000" disableUploadTimeout="true" />

maxThreadsReprésentationtomcat Combien de Threads peuvent être créés pour traiter les demandes .
minSpareThread Représentationtomcat Combien de Threads seront créés au début , Même les oisifs créent .
maxSpareThread Représentationtomcat Nombre maximum de Threads inactifs créés .Une foistomcat Le nombre de Threads créés atteint ce goulot d'étranglement , Il faut récupérer les fils. .
connectionTimeout Indique la durée de la connexion .

Supposons que nous ayons 1000 Accès simultané demandé ,Mais untomcatDemaxThreads Uniquement pour 500, La congestion de la demande se produit , C'est l'un des goulets d'étranglement .

Redis Analyse partielle des goulets d'étranglement de performance

Un peu gros.keyDemandes de renseignements, Cause de congestion du réseau
Par exemple, vers un list Stocké dans la collection 50mDonnées,Une fois que c'est arrivé,listRequête complète, Et il y a d'autres instructions en cours d'accès , Peut facilement causer un blocage du réseau .Parce queredis Conçu pour traiter les demandes par un seul thread , Donc d'autres instructions sont envoyées à redisSur le serveur,Il faut attendre.redis Vous ne pouvez pas continuer tant que vous n'avez pas terminé la tâche précédente .

Il y a eu quelques ”Opérations illégales“
Les violations les plus courantes :Exécution par lotskeysDirectives
Inredis En hauteur qpsDans l'état de,N'hésitez paskeys Les ordres peuvent être mortels. .keys La complexité temporelle de l'instruction est O(n)Niveau, Facile à provoquer un blocage du système temporel .

Pas assez d'espace mémoire
Quandredis Quand il n'y a pas assez d'espace mémoire , En gros, tout le système est paralysé. . Donc, nous sommes en train de mettre en place redis Toutes les valeurs dans doivent avoir un délai d'expiration raisonnable , Et la taille des données stockées .


MySQL Analyse partielle des goulets d'étranglement de performance

D'habitude, on analyse sql Il y a une erreur dans la requête , C'est de monter directement explianAnalyse, Mais ignorer le contexte opérationnel du système .
Supposons qu'il y ait unt_userTableau, Des dizaines de millions de données ont été stockées , Et aussi pour les utilisateurs id Indexé ,Maissql La vitesse d'exécution est toujours supérieure à 1sDurée, C'est à ce moment qu'une autre façon de penser est nécessaire pour l'analyse .
Pensez par exemple à la séparation des tableaux , Si le tableau doit être divisé horizontalement ,Démonter comme suit:t_user_01,t_user_02…

Voici quelques - uns des points que j'ai résumés sur les goulets d'étranglement possibles au niveau de la base de données :
1.Verrouillage
Vérifier si la table de verrouillage peut causer une réponse lente de la base de données .

2.sql La requête a encore de la place pour l'optimisation ,À perfectionner

D'habitude, on s'occupe de sql L'analyse d'exécution de explainCommande de visualisation:
J'ai posté un message sur explain Le tableau de signification des paramètres communs de :

id SELECTIdentificateur.C'estSELECTNuméro de série de la requête pour
select_type SIMPLE:Simple.SELECT(Non utiliséUNIONOu sous - Requête)
PRIMARY:À l'extérieur.SELECT
UNION:UNIONDeuxième ou dernierSELECTDéclarations
DEPENDENT UNION:UNIONDeuxième ou dernierSELECTDéclarations,Dépend de la requête externe
UNION RESULT:UNION Les résultats de
SUBQUERY:Première Sous - RequêteSELECT
DEPENDENT SUBQUERY:Première Sous - RequêteSELECT,Dépend de la requête externe
DERIVED:Tableau d'exportationSELECT(FROMSous - requête de clause)
table Requêtesql Nom du tableau associé à la procédure
type Type de connexion. Les différents types de joints sont donnés ci - dessous. , Trier du meilleur au pire :
system:Le tableau n'a qu'une seule ligne(=Tableau du système).C'estconstUn cas particulier de type join.
const:Le tableau a un maximum d'une ligne correspondante,Il sera lu au début de la requête.Parce qu'il n'y a qu'une seule ligne,Les valeurs des colonnes sur cette ligne peuvent être considérées comme constantes par le reste de l'optimiseur.constLa montre est rapide,Parce qu'ils ne lisent qu'une seule fois!
eq_ref:Pour chaque combinaison de lignes du tableau précédent,Lire une ligne du tableau,Après la performanceconst.
ref:Pour chaque combinaison de lignes du tableau précédent,Toutes les lignes avec des valeurs d'index correspondantes sont lues à partir de ce tableau.
ref_or_null:Le type de connexion est similaire àref,Mais ajoutéMySQLPeut être recherché spécifiquement pour inclureNULLLigne de valeur.
index_merge:Ce type de jointure indique que la méthode d'optimisation de la fusion d'index est utilisée.
unique_subquery:Ce type remplace leINSous - Requêteref: value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subqueryEst une fonction de recherche d'index,Peut remplacer complètement la Sous - Requête,Plus efficace.
index_subquery:Ce type de jointure est similaire àunique_subquery.Peut être remplacéINSous - Requête,Mais ne convient qu'aux index non uniques dans les sous - requêtes suivantes: value IN (SELECT key_column FROM single_table WHERE some_expr)
range:Récupérer uniquement les lignes pour une plage donnée,Utiliser un index pour sélectionner une ligne.
index:Ce type de connexion est compatible avecALLMême chose.,Sauf que seuls les arbres index sont numérisés.C'est généralement plusALLAllez,Parce que les fichiers index sont généralement plus petits que les fichiers de données.
ALL:Pour chaque combinaison de lignes du tableau précédent,Effectuer un balayage complet de la table.
possible_keys Ce paramètre ressemble plus à mysql Une prévision de , Désignation des prévisions sql Quels index pourraient entrer en vigueur pendant l'exécution
key sql Colonnes indexées en vigueur pendant l'exécution
key_len AfficherMySQLDétermine la longueur de la clé utilisée.
ref Affiche quelle colonne ou constante est utilisée etkeySélectionnez une ligne dans le tableau ensemble.
rows AfficherMySQLLe nombre de lignes qu'il pense devoir vérifier lors de l'exécution de la requête. La multiplication des données entre plusieurs lignes permet d'estimer le nombre de lignes à traiter .
filtered Affiche une estimation en pourcentage du nombre de lignes filtrées par condition.
Extra Distinct:MySQLConclusions1Après les lignes correspondantes,Arrêter de rechercher plus de lignes pour la combinaison de lignes actuelle.
Not exists:MySQLCapable d'effectuer des requêtesLEFT JOINOptimisation,Découverte1CorrespondanceLEFT JOINAprès la ligne standard,Ne vérifiez plus d'autres lignes dans ce tableau pour les combinaisons de lignes précédentes.
range checked for each record (index map: #):MySQLAucun bon index disponible trouvé,Mais il a été constaté que si les valeurs des colonnes du tableau précédent sont connues,Certains index peuvent être utilisés.
Using filesort:MySQLUne livraison supplémentaire est nécessaire,Pour trouver comment récupérer les lignes dans l'ordre de tri.
Using index:Extraire les informations de colonne d'un tableau en lisant les lignes réelles à partir de l'arbre d'index seulement sans autre recherche.
Using temporary:Pour résoudre la requête,MySQLUne table temporaire doit être créée pour tenir compte des résultats.
Using where:WHERE Clause utilisée pour limiter quelle ligne correspond au tableau suivant ou est envoyée au client.
Using sort_union(…), Using union(…), Using intersect(…):Ces fonctions expliquent commentindex_mergeType de jointure fusionner la numérisation de l'index.
Using index for group-by:Similaire au tableau d'accèsUsing indexComment,Using index for group-byReprésentationMySQLUn index a été trouvé,Peut être utilisé pour vérifier Demandes de renseignementsGROUP BYOuDISTINCTToutes les colonnes de la requête,Au lieu de rechercher des disques durs supplémentaires pour accéder aux tables réelles.

3.Trop de données trouvées
Par exemple, un sql La quantité d'informations de données de la table entière est directement interrogée , Pleine bande passante du réseau , Il y a donc eu une congestion du réseau lors de l'accès .

4. Matériel insuffisant
Par exemple, face à des hauteurs qps Quand j'ai demandé , La base de données elle - même a une faible configuration matérielle de la machine , Le traitement naturel sera lent .

5.Adaptationhash Un conflit de serrure s'est produit
AHI- Oui.innodb Propriétés spécifiques au moteur de stockage ,innodb Le moteur de stockage optimise de façon adaptative les résultats des requêtes de données indexées , Certaines requêtes d'index spécifiques sont automatiquement créées lorsque leur fréquence est particulièrement élevée hashIndex,Pour améliorer l'efficacité de la requête.Par rapport àB+Tree Pour l'index ,hash L'indexation peut réduire considérablement ioNombre de visite pour,“Un coup.” Recherche de données, Performance plus efficace ,EthashL'index est établi parmysql Auto - adaptateur interne ,Pas besoin.dba Trop d'interventions extérieures .
Versions antérieureshash L'index utilise un seul mode de verrouillage pour prévenir les problèmes d'accès simultanés , Cela a un certain effet sur l'efficacité opérationnelle du programme lui - même ”Réduction“, Par la suite hash Index partitionné , Différentes pages de données hashtable, Chaque partition a son propre verrou pour empêcher l'accès simultané .
Si un jour vous découvrez qu'il y a beaucoup de fils bloqués RW-latchesQuand, C'est peut - être parce que hash Blocage causé par une charge d'accès simultanée élevée pour l'index , En augmentant hash Paramètres de partition pour l'index , Ou désactiver l'adaptation hash Indexer les propriétés pour le traitement .

版权声明
本文为[Danny... Idea]所创,转载请带上原文链接,感谢
https://chowdera.com/2022/01/202201080559031404.html

随机推荐