Concentration élevée L'urgence et la réponse rapide correspondent à deux indicateurs clés de l'optimisation des performances : Débit et Latence
Pour différents problèmes de performances, différents outils d'analyse des performances doivent être sélectionnés. Les éléments suivants sont les outils de performances Linux couramment utilisés et les types correspondants de problèmes de performances analysés.
Charge moyenne : Le processus moyen du système dans un état exécutable et un état ininterrompu dans un nombre d'unités de temps, qui est le nombre moyen de processus actifs. Cela n’est pas directement lié à l’utilisation du processeur telle que nous l’entendons traditionnellement.
Le processus ininterruptible est un processus qui se trouve dans un processus critique dans l'état du noyau (comme la réponse d'E/S commune en attente du périphérique). L'état ininterruptible est en fait un mécanisme de protection du système pour les processus et les périphériques matériels.
Dans l'environnement de production réel, surveillez la charge moyenne du système et jugez la tendance des changements de charge en fonction des données historiques. Lorsqu’il y a une tendance évidente à la hausse de la charge, effectuez une analyse et une enquête en temps opportun. Bien sûr, vous pouvez également définir un seuil (comme lorsque la charge moyenne est supérieure à 70% du nombre de CPU)
Dans le vrai travail, on confond souvent les notions de charge moyenne et d'utilisation du CPU. les deux ne sont pas complètement équivalents :
Lorsque la charge moyenne du processeur est élevée, il se peut que le processeur soit causé par des processus intensifs ou des E/S occupées. Lors d'une analyse spécifique, vous pouvez combiner l'outil mpstat/pidstat pour vous aider à analyser la source de charge
Le changement de contexte CPU consiste à enregistrer le contexte CPU (registre CPU et PC) de la tâche précédente, puis à charger la nouvelle tâche. contexte à ces registres et au compteur de programme, et passe enfin à l'emplacement indiqué par le compteur de programme pour exécuter la nouvelle tâche. Parmi eux, le contexte enregistré sera stocké dans le noyau du système et chargé à nouveau lorsque la tâche sera reprogrammée pour exécution afin de garantir que l'état d'origine de la tâche ne soit pas affecté.
Selon le type de tâche, la commutation de contexte CPU est divisée en :
Commutation de contexte de processus Le processus ux suit Les autorisations de niveau divisent l'espace d'exécution d'un processus dans l'espace noyau et l'espace utilisateur. La transition du mode utilisateur au mode noyau doit être effectuée via des appels système.Le processus d'appel système n'implique pas de ressources en mode utilisateur de processus telles que la mémoire virtuelle, et ne change pas non plus de processus. Cela diffère du changement de contexte de processus au sens traditionnel du terme. C'est pourquoi l'appel système est souvent appelé commutateur de mode privilégié .
Les processus sont gérés et planifiés par le noyau, et le changement de contexte de processus ne peut se produire qu'en mode noyau. Par conséquent, par rapport aux appels système, avant de sauvegarder l'état du noyau et les registres du processeur du processus en cours, la mémoire virtuelle et la pile du processus doivent d'abord être enregistrées. Après avoir chargé l'état du noyau du nouveau processus, la mémoire virtuelle et la pile utilisateur du processus doivent être actualisées.
Le processus n'a besoin de changer de contexte que lorsqu'il est programmé pour s'exécuter sur le processeur. Il existe les scénarios suivants : les tranches de temps du processeur sont allouées à tour de rôle, des ressources système insuffisantes entraînent le blocage du processus, le processus se bloque activement pendant le processus. fonction de veille et processus hautement prioritaires Tranche de temps de préemption, lorsque le matériel s'interrompt, le processus sur le processeur est suspendu et exécute à la place le service d'interruption dans le noyau.
Le changement de contexte de thread est divisé en deux types :
Le changement de thread dans le même processus consomme moins de ressources, ce qui est également l'avantage du multi-thread.
Le changement de contexte d'interruption n'implique pas l'état utilisateur du processus, donc le contexte d'interruption inclut uniquement l'état nécessaire à l'exécution du programme de service d'interruption d'état du noyau (registres CPU, pile du noyau, interruption matérielle paramètres, etc).
La priorité du traitement des interruptions est supérieure à celle du processus, donc le changement de contexte d'interruption et le changement de contexte de processus ne se produiront pas en même temps
Docker+K8s+Jenkins, informations vidéo complètes sur la technologie grand public
Vous pouvez vérifier la situation globale de changement de contexte du système via vmstat
1 2 3 4 5 6 7 8 9 10 11 |
|
Pour afficher les détails de chaque processus, vous devez utiliser pidstat pour afficher le changement de contexte de chaque processus
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 3 4 5 6 7 8 |
|
说明运行/等待CPU的进程过多,导致大量的上下文切换,上下文切换导致系统的CPU占用率高
1 |
|
从结果中看出是sysbench导致CPU使用率过高,但是pidstat输出的上下文次数加起来也并不多。分析sysbench模拟的是线程的切换,因此需要在pidstat后加-t参数查看线程指标。
另外对于中断次数过多,我们可以通过/proc/interrupts文件读取
1 |
|
发现次数变化速度最快的是重调度中断(RES),该中断用来唤醒空闲状态的CPU来调度新的任务运行。分析还是因为过多任务的调度问题,和上下文切换分析一致。
Linux作为多任务操作系统,将CPU时间划分为很短的时间片,通过调度器轮流分配给各个任务使用。为了维护CPU时间,Linux通过事先定义的节拍率,触发时间中断,并使用全局变了jiffies记录开机以来的节拍数。时间中断发生一次该值+1.
CPU使用率,除了空闲时间以外的其他时间占总CPU时间的百分比。可以通过/proc/stat中的数据来计算出CPU使用率。因为/proc/stat时开机以来的节拍数累加值,计算出来的是开机以来的平均CPU使用率,一般意义不大。可以间隔取一段时间的两次值作差来计算该段时间内的平均CPU使用率。性能分析工具给出的都是间隔一段时间的平均CPU使用率,要注意间隔时间的设置。
CPU使用率可以通过top 或 ps来查看。分析进程的CPU问题可以通过perf,它以性能事件采样为基础,不仅可以分析系统的各种事件和内核性能,还可以用来分析指定应用程序的性能问题。
perf top / perf record / perf report (-g 开启调用关系的采样)
1 2 3 4 |
|
发现此时每秒可承受请求给长少,此时将测试的请求数从100增加到10000。在另外一个终端运行top查看每个CPU的使用率。发现系统中几个php-fpm进程导致CPU使用率骤升。
接着用perf来分析具体是php-fpm中哪个函数导致该问题。
1 |
|
发现其中sqrt和add_function占用CPU过多, 此时查看源码找到原来是sqrt中在发布前没有删除测试代码段,存在一个百万次的循环导致。将该无用代码删除后发现nginx负载能力明显提升
1 2 3 |
|
实验结果中每秒请求数依旧不高,我们将并发请求数降为5后,nginx负载能力依旧很低。
此时用top和pidstat发现系统CPU使用率过高,但是并没有发现CPU使用率高的进程。
出现这种情况一般时我们分析时遗漏的什么信息,重新运行top命令并观察一会。发现就绪队列中处于Running状态的进行过多,超过了我们的并发请求次数5. 再仔细查看进程运行数据,发现nginx和php-fpm都处于sleep状态,真正处于运行的却是几个stress进程。
下一步就利用pidstat分析这几个stress进程,发现没有任何输出。用ps aux交叉验证发现依旧不存在该进程。说明不是工具的问题。再top查看发现stress进程的进程号变化了,此时有可能时以下两种原因导致:
可以通过pstree来查找 stress的父进程,找出调用关系。
1 |
|
发现是php-fpm调用的该子进程,此时去查看源码可以看出每个请求都会调用一个stress命令来模拟I/O压力。之前top显示的结果是CPU使用率升高,是否真的是由该stress命令导致的,还需要继续分析。代码中给每个请求加了verbose=1的参数后可以查看stress命令的输出,在中断测试该命令结果显示stress命令运行时存在因权限问题导致的文件创建失败的bug。
此时依旧只是猜测,下一步继续通过perf工具来分析。性能报告显示确实时stress占用了大量的CPU,通过修复权限问题来优化解决即可.
对于不可中断状态,一般都是在很短时间内结束,可忽略。但是如果系统或硬件发生故障,进程可能会保持不可中断状态很久,甚至系统中出现大量不可中断状态,此时需注意是否出现了I/O性能问题。
僵尸进程一般多进程应用容易遇到,父进程来不及处理子进程状态时子进程就提前退出,此时子进程就变成了僵尸进程。大量的僵尸进程会用尽PID进程号,导致新进程无法建立。
1 2 |
|
可以看到此时有多个app进程运行,状态分别时Ss+和D+。其中后面s表示进程是一个会话的领导进程,+号表示前台进程组。
其中进程组表示一组相互关联的进程,子进程是父进程所在组的组员。会话指共享同一个控制终端的一个或多个进程组。
用top查看系统资源发现:1)平均负载在逐渐增加,且1分钟内平均负载达到了CPU个数,说明系统可能已经有了性能瓶颈;2)僵尸进程比较多且在不停增加;3)us和sys CPU使用率都不高,iowait却比较高;4)每个进程CPU使用率也不高,但有两个进程处于D状态,可能在等待IO。
分析目前数据可知:iowait过高导致系统平均负载升高,僵尸进程不断增长说明有程序没能正确清理子进程资源。
用dstat来分析,因为它可以同时查看CPU和I/O两种资源的使用情况,便于对比分析。
1 |
|
可以看到当wai(iowait)升高时磁盘请求read都会很大,说明iowait的升高和磁盘的读请求有关。接下来分析到底时哪个进程在读磁盘。
之前top查看的处于D状态的进程号,用pidstat -d -p XXX 展示进程的I/O统计数据。发现处于D状态的进程都没有任何读写操作。在用pidstat -d 查看所有进程的I/O统计数据,看到app进程在进行磁盘读操作,每秒读取32MB的数据。进程访问磁盘必须使用系统调用处于内核态,接下来重点就是找到app进程的系统调用。
1 |
|
报错没有权限,因为已经时root权限了。所以遇到这种情况,首先要检查进程状态是否正常。ps命令查找该进程已经处于Z状态,即僵尸进程。
这种情况下top pidstat之类的工具无法给出更多的信息,此时像第5篇一样,用perf record -d和perf report进行分析,查看app进程调用栈。
看到app确实在通过系统调用sys_read()读取数据,并且从new_sync_read和blkdev_direct_IO看出进程时进行直接读操作,请求直接从磁盘读,没有通过缓存导致iowait升高。
通过层层分析后,root cause是app内部进行了磁盘的直接I/O。然后定位到具体代码位置进行优化即可。
Après l'optimisation ci-dessus, iowait a considérablement diminué, mais le nombre de processus zombies continue d'augmenter. Tout d'abord, localisez le processus parent du processus zombie. Utilisez pstree -aps XXX pour imprimer l'arborescence des appels du processus zombie et constatez que le processus parent est le processus d'application.
Vérifiez le code de l'application pour voir si la fin du processus enfant est gérée correctement (si wait()/waitpid() est appelé, si une fonction de traitement du signal SIGCHILD est enregistrée, etc.).
Lorsque vous rencontrez une augmentation de l'iowait, utilisez d'abord des outils tels que dstat et pidstat pour confirmer s'il y a un problème d'E/S de disque, puis découvrez quels processus sont à l'origine de l'E/S si vous ne pouvez pas utiliser strace. pour analyser directement l'appel de processus, vous pouvez utiliser l'outil perf pour l'analyser.
Pour le problème zombie, utilisez pstree pour trouver le processus parent, puis regardez le code source pour vérifier la logique de traitement pour la fin du processus enfant.
Utilisation du processeur
Changement de contexte de processus
Y compris la commutation volontaire lorsque les ressources ne peuvent pas être obtenues et la commutation involontaire lorsque le système force la planification. La commutation de contexte elle-même est une fonction essentielle pour garantir le fonctionnement normal de Linux. Une commutation excessive consommera le temps CPU du processus en cours d'exécution d'origine dans le registre. Noyau et mémoire virtuelle et autres sauvegardes et récupérations de données. De plus, parcourez les coulisses du programmeur de comptes publics Xiaole pour répondre aux « questions d'entretien » et obtenez un coffret cadeau surprise.
Taux de réussite du cache CPU
Réutilisation du cache CPU, plus le taux de réussite est élevé, meilleures sont les performances Parmi eux, L1/L2 est couramment utilisé en monocœur et L3 est utilisé en multi. -core
"Outils de performances" pid après avoir jugé la charge, les statistiques vérifient chacun. Processeurs et utilisation du processeur par processus. Découvrez les processus provoquant une charge moyenne plus élevéeTrouvez le bon outil en fonction de différents indicateurs de performance :
Dans un environnement de production, les développeurs n'ont souvent pas l'autorisation d'installer de nouveaux packages d'outils et ne peuvent que maximiser l'utilisation des outils déjà installés dans le système. Par conséquent, il est nécessaire de comprendre ce que certains indicateurs analysent. les outils peuvent fournir.
Exécutez d'abord plusieurs outils qui prennent en charge plus d'indicateurs, tels que top/vmstat/pidstat. En fonction de leur sortie, vous pouvez déterminer de quel type de problème de performances il s'agit. Après avoir localisé le processus, utilisez strace/perf pour analyser la situation d'appel pour une analyse plus approfondie. Si elle est causée par une interruption logicielle, utilisez /proc/softirqs
.Optimisation des applications
TPS, La différence et compréhension du QPS et du débit du système
QPS(TPS)
Nombre de concurrences
Temps de réponse
QPS(TPS)=Nombre de concurrences/temps de réponse moyen
Serveur de requêtes utilisateur
Traitement interne du serveur
Le serveur le renvoie au client
Le QPS est similaire au TPS, mais une visite sur une page forme un TPS, mais une requête de page peut inclure plusieurs requêtes au serveur, qui peut être compté Entrez plusieurs QPS
Taux de requêtes QPS (Queries Per Second) par seconde, le nombre de requêtes auxquelles un serveur peut répondre par seconde.
TPS (Transactions Per Second), les résultats des tests logiciels
Débit du système, comprenant plusieurs paramètres importants :
Seul le noyau le peut. accéder directement à la mémoire physique. Le noyau Linux fournit un espace d'adressage virtuel indépendant pour chaque processus, et cet espace d'adressage est continu. De cette manière, le processus peut facilement accéder à la mémoire (mémoire virtuelle).
L'intérieur de l'espace d'adressage virtuel est divisé en deux parties : l'espace noyau et l'espace utilisateur. La plage de l'espace d'adressage des processeurs avec différentes longueurs de mots est différente. L'espace du noyau système 32 bits occupe 1G et l'espace utilisateur occupe 3G. L'espace noyau et l'espace utilisateur des systèmes 64 bits sont tous deux de 128T, occupant respectivement les parties les plus hautes et les plus basses de l'espace mémoire, et la partie médiane n'est pas définie.
Toute la mémoire virtuelle ne se verra pas attribuer de mémoire physique, seule celle réellement utilisée. La mémoire physique allouée est gérée via le mappage de mémoire. Afin de compléter le mappage de la mémoire, le noyau maintient une table de pages pour chaque processus afin d'enregistrer la relation de mappage entre les adresses virtuelles et les adresses physiques. La table des pages est en fait stockée dans l'unité de gestion de mémoire du processeur MMU, et le processeur peut directement connaître la mémoire accessible via le matériel.
Lorsque l'adresse virtuelle à laquelle le processus accède est introuvable dans la table des pages, le système génère une exception de défaut de page, entre dans l'espace du noyau pour allouer de la mémoire physique, met à jour la table des pages du processus, puis retourne dans l'espace utilisateur. pour reprendre le fonctionnement du procédé.
MMU gère la mémoire en unités de pages, avec une taille de page de 4 Ko. Afin de résoudre le problème du trop grand nombre d'entrées dans la table de pages, Linux fournit les mécanismes de Table de pages multi-niveaux et HugePage.
La mémoire de l'espace utilisateur est divisée en cinq segments de mémoire différents de bas en haut :
malloc correspond à l'appel système :
Le cache du premier peut réduire l'apparition d'exceptions de faute de page et améliorer l'efficacité de l'accès à la mémoire. Cependant, comme la mémoire n'est pas restituée au système, des allocations/libérations fréquentes de mémoire entraîneront une fragmentation de la mémoire lorsque la mémoire est occupée.
Ce dernier est directement renvoyé au système une fois libéré, donc une exception de défaut de page se produira à chaque fois que mmap se produira. Lorsque le travail de mémoire est occupé, des allocations de mémoire fréquentes entraîneront un grand nombre d'exceptions de fautes de page, augmentant ainsi la charge de gestion du noyau.
Les deux appels ci-dessus n'attribuent pas réellement de mémoire. Ces mémoires n'entrent dans le noyau que via des exceptions de faute de page lorsqu'elles sont accédées pour la première fois et sont allouées par le noyau
.Lorsque la mémoire est limitée, le système récupère la mémoire des manières suivantes :
Cache de recyclage : l'algorithme LRU récupère les pages de mémoire les moins récemment utilisées
; Recyclage est peu fréquent Accès à la mémoire : écrivez la mémoire rarement utilisée sur le disque via la partition d'échange
Tuez le processus : mécanisme de protection du noyau OOM (plus le processus consomme de mémoire, plus le oom_score est grand et plus le CPU est important qu'il occupe, plus le oom_score est petit. Vous pouvez passer /proc ajuster manuellement oom_adj)
.1 |
|
free来查看整个系统的内存使用情况
top/ps来查看某个进程的内存使用情况
buffer est un cache de données de disque, le cache est un cache de données de fichiers, ils sont utilisés à la fois dans les demandes de lecture et dans les demandes d'écriture
Taux de réussite du cache fait référence au nombre de requêtes pour obtenir des données directement via le cache, représentant le pourcentage de toutes les requêtes. Plus le taux de réussite est élevé, plus les avantages apportés par le cache sont importants et meilleures sont les performances de l'application.
Après avoir installé le package bcc, vous pouvez surveiller les accès en lecture et en écriture du cache via cachestat et cachetop.
安装pcstat后可以查看文件在内存中的缓存大小以及缓存比例
1 2 3 4 5 |
|
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 |
|
但是凭感觉可知如果缓存命中读速度不应如此慢,读次数时1024,页大小为4K,五秒的时间内读取了1024*4KB数据,即每秒0.8MB,和结果中32MB相差较大。说明该案例没有充分利用缓存,怀疑系统调用设置了直接I/O标志绕过系统缓存。因此接下来观察系统调用.
1 2 |
|
这就解释了为什么读32MB数据那么慢,直接从磁盘读写肯定远远慢于缓存。找出问题后我们再看案例的源代码发现flags中指定了直接IO标志。删除该选项后重跑,验证性能变化。
Pour les applications, l'allocation et le recyclage dynamiques de la mémoire sont un module fonctionnel logique central et complexe. Divers « accidents » se produiront dans le processus de gestion de la mémoire :
La répartition de la mémoire virtuelle de bas en haut est segment en lecture seule, segment de données, tas, segment de mappage de mémoire et pile cinq parties. Parmi eux, ceux qui peuvent provoquer des fuites de mémoire sont :
Les fuites de mémoire sont plus nocives. Ces mémoires oubliées ne sont pas seulement utilisées par. applications Ils ne peuvent pas y accéder eux-mêmes et le système ne peut pas les attribuer à nouveau à d'autres applications. Les fuites de mémoire s'accumulent et même épuisent la mémoire du système
Pré-installer systat, docker, bcc
.1 2 3 |
|
可以看到free在不断下降,buffer和cache基本保持不变。说明系统的内存一致在升高。但并不能说明存在内存泄漏。此时可以通过memleak工具来跟踪系统或进程的内存分配/释放请求。另外,搜索公众号Linux就该这样学后台回复“git书籍”,获取一份惊喜礼包。
1 |
|
从memleak输出可以看到,应用在不停地分配内存,并且这些分配的地址并没有被回收。通过调用栈看到是fibonacci函数分配的内存没有释放。定位到源码后查看源码来修复增加内存释放函数即可.
系统内存资源紧张时通过内存回收和OOM杀死进程来解决。其中可回收内存包括:
L'essence de l'échange est d'utiliser un morceau d'espace disque ou un fichier local comme mémoire, y compris deux processus d'échange et d'échange :
Comment Linux mesure-t-il si les ressources mémoire sont limitées ?
Récupération directe de la mémoire Nouvelle allocation de mémoire de gros blocs demandée, mais mémoire restante insuffisante. A ce moment, le système récupérera une partie de la mémoire
kswapd0 Le thread du noyau récupère régulièrement de la mémoire. Afin de mesurer l'utilisation de la mémoire, trois seuils de pages_min, pages_low et pages_high sont définis et des opérations de recyclage de mémoire sont effectuées en fonction de ceux-ci.
Mémoire restante < pages_min, la mémoire disponible pour le processus est épuisée, seul le noyau peut allouer de la mémoire
pages_min < est élevé, kswapd0 effectue le recyclage de la mémoire jusqu'à ce que la mémoire restante > pages_high
pages_low < mémoire restante <
剩余内存 > pages_high,说明剩余内存较多,无内存压力
pages_low = pages_min 5 / 4 pages_high = pages_min 3 / 2
很多情况下系统剩余内存较多,但SWAP依旧升高,这是由于处理器的NUMA架构。
在NUMA架构下多个处理器划分到不同的Node,每个Node都拥有自己的本地内存空间。在分析内存的使用时应该针对每个Node单独分析
1 |
|
内存三个阈值可以通过/proc/zoneinfo来查看,该文件中还包括活跃和非活跃的匿名页/文件页数。
Lorsqu'un nœud manque de mémoire, le système peut rechercher des ressources libres auprès d'autres nœuds ou récupérer de la mémoire dans la mémoire locale. Ajustez via /proc/sys/vm/zone_raclaim_mode.
Pendant le processus de recyclage lui-même, Linux ajuste l'activité d'utilisation de Swap en fonction de l'option /proc/sys/vm/swapiness, de 0 à 100. Plus la valeur est grande, plus activement. Swap est utilisé, c'est-à-dire que plus il est enclin à utiliser Swap pour recycler des pages anonymes ; plus la valeur est petite, plus Swap est utilisé passivement, c'est-à-dire plus il est probable qu'il recycle les pages de fichiers.
注意:这只是调整Swap积极程度的权重,即使设置为0,当剩余内存+文件页小于页高阈值时,还是会发生Swap。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
说明剩余内存和缓冲区的波动变化正是由于内存回收和缓存再次分配的循环往复。有时候Swap用的多,有时候缓冲区波动更多。此时查看swappiness值为60,是一个相对中和的配置,系统会根据实际运行情况来选去合适的回收类型.
Indicateurs de mémoire système
Mémoire utilisée/mémoire restante : fichier de lecture du disque Le cache des pages , la partie récupérable dans l'allocateur de dalleTrouvez le bon outil en fonction de différents indicateurs de performances :
indicateurs de performance inclus dans l'outil d'analyse de la mémoire:
Exécutez généralement en premier plusieurs outils de performances avec une couverture relativement large, tels que free, top, vmstat, pidstat, etc.
Idées d'optimisation courantes :
La commande vmstat est la plus courante L'outil de surveillance Linux/Unix peut afficher la valeur d'état du serveur à un intervalle de temps donné, y compris l'utilisation du processeur du serveur , l'utilisation de la mémoire, l'état d'échange de mémoire virtuelle et l'état de lecture et d'écriture des E/S.可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
|
pidstat主要用于监控全部或指定进程占用系统资源的情况,如CPU,内存、设备IO、任务切换、线程等。
使用方法:
Comptez l'utilisation des E/S
1.1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
2、统计CPU使用情况
1 2 3 4 5 6 7 8 9 |
|
3. Statistiques d'utilisation de la mémoire
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
4、查看具体进程使用情况
1 2 3 4 5 6 |
|
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!