Lorsque le code s'exécute, il peut en effet envoyer et recevoir des messages normalement .
🎜Mais après l'exécution de ce codependant un moment, erreur de délai d'attente d'E/S. 🎜🎜🎜🎜🎜Il s'agit en fait d'un problème qui a été étudié récemment. J'ai trouvé que ce piège était peut-être plus facile à surmonter, j'ai donc simplifié le code ici. 🎜🎜Lephénomène qui se produit dans la production réelle est,golang est en cours de lancementhttpLorsqu'il est appelé, bien que http.Transport définit 3sdélai d'expiration, Rapport d'erreur de délai d'attente d'E/S. 🎜🎜Mais en regardant les services en aval, j'ai découvert que les services en aval étaient en fait100 ms a été renvoyé. 🎜🎜🎜🎜
Dépannage
L'analyse des modifications du corps du message correspondant au protocole réseau à cinq couches
est très étrange. Il est évident que le traitement de l'affichage côté serveur prend du temps100 ms, et le délai d'expiration du client est défini sur <code style="font-size: Heherit;line-height: Heherit;padding: 2px 4px;border-radius: 4px;margin-right: 2px ;margin-left: 2px ;color: rgb(255, 82, 82);background: rgb(248, 248, 248);">3s, pourquoi une erreur de délai d'attente se produit-elle Qu'en est-il du délai d'expiration des E/S ? 100ms,且客户端超时设的是3s, 怎么就出现超时报错 i/o timeout 呢?
Parce que les journaux imprimés par le serveur ne sont en fait que des journaux imprimés par la
couche d'application du serveur. Mais une fois que la couche d'application client a envoyé les données, elles passent également par la couche de transport, la couche réseau, la couche liaison de données et la couche physique du client, puis passent par la couche physique, la couche liaison de données, la couche réseau et la couche transport du serveur vers le service La couche application à la fin
. La couche d'application serveur prend
100 ms, puis revient au chemin d'origine. Le reste3s-100ms
Peut-être qu'il est dépensé sur différentes couches dans l'ensemble du processus. Par exemple, lorsque le réseau n'est pas bon, la couche transport TCP perd vigoureusement les paquets et les retransmet. Il n'y a aucun problème avec le réseau L'ensemble du processus d'envoi et de réception du client. au serveur prend environ du temps. C'est-à-dire Environ 100 ms. Un délai d'attente se produit en raison de problèmes de logique de traitement du client.
🎜🎜🎜Généralement, lorsque vous rencontrez des problèmes, dans la plupart des cas, ce n'est pas un problème avec le réseau sous-jacent, soupçonnez simplement qu'il s'agit de votre propre problème🎜. Si vous n'abandonnez pas, prenez un sac et. jetez un oeil. 🎜🎜🎜🎜🎜🎜Résultat de capture de paquets🎜🎜🎜Analyse, depuis le début des trois poignées de main (🎜L'endroit où est dessinée la case rouge🎜). 🎜
Protocole HTTP de , 82, 82);background: rgb(248, 248, 248);">Avant la version 1.0, la valeur par défaut était Connexion courte , une connexion TCP sera établie à chaque fois qu'une requête est faite. Envoyez et recevez des données. Puis déconnectez-vous. 🎜🎜La connexion TCP est une poignée de main à trois à chaque fois. Chaque déconnexion nécessite quatre vagues. 🎜🎜En fait, il n'est pas nécessaire d'établir une nouvelle connexion à chaque fois. Il suffit que la connexion établie ne soit pas déconnectée et réutilisée à chaque envoi de données. 🎜🎜Ainsi, le protocole HTTP a changé de Après la version 1.1, il sera utilisé par défaut Connexion longue. Pour des informations spécifiques, veuillez consulter cet article précédent. 🎜🎜Puisla bibliothèque standard golang est également compatible avec cette implémentation. 🎜🎜En établissant un pool de connexions, ciblez Chaque nom de domaine établit une longue connexion TCP, telle que http://baidu.com et http://golang.com sont deux noms de domaine différents. 🎜🎜Première visitehttp://baidu.com Une connexion sera établie lors de l'utilisation du nom de domaine. Après utilisation, il sera placé dans le pool de connexions inactif et téléchargé à nouveau : rgb(255, 82, 82);background: rgb(248, 248, 248);">http://baidu.com récupérera la connexion du pool de connexionsRéutiliser. 🎜Réutiliser les connexions longues
Une digression : Cela explique aussi la dernière question de cet article, pourquoi il faut mettre l'accent sur le même nom de domaine : un nom de domaine établira une connexion, et une connexion correspondra à Une goroutine de lecture et une goroutine d'écriture. Parce qu'il s'agit du même nom de domaine, il sera divulgué à la fin -left: 2px;color: rgb(255, 82, 82);background: rgb(248, 248, 248);">3 goroutines, s'il s'agit de noms de domaine différents, cela fuira1+2*N coroutines, N est le nombre de noms de domaine. 3个goroutine,如果不同域名的话,那就会泄漏 1+2*N 个协程,N就是域名数。
🎜🎜🎜 Supposons que la première requête consiste à 100 ms, chaque requête est terminée http://baidu.com Après tout, placez-le dans le pool de connexions et continuez à le réutiliser la prochaine fois. RépétezLorsque 30 requêtes sont effectuées, la connexion a été utilisée depuis le moment de l'établissement jusqu'au retour du service3000 ms, qui atteint juste le seuil de délai d'attente défini de 🎜3s🎜, le client signalera un délai d'attente à ce moment-làdélai d'expiration des E/S . 🎜🎜Bien qu'à ce moment-là, le serveur ait effectivement dépensé 100 ms, mais ne supporte pas le devant也就是说只要通过 http.Transport 设置了 err = conn.SetDeadline(time.Now().Add(time.Second * 3)),并且你用了长连接,哪怕服务端处理再快,客户端设置的超时再长,总有一刻,你的程序会报超时错误。
Ne pas utiliser Le délai d'expiration défini dans http.Transport est le délai d'expiration de la connexion, pas le délai d'expiration de la demande. Sinon, inexplicable erreur de délai d'attente io. http.Transport中设置超时,那是连接的超时,不是请求的超时。否则可能会出现莫名 io timeout报错。
请求的超时在创建client
Délai d'expiration de la demande lors de la création : rgb(255, 82, 82); background: rgb(248, 248, 248);">client. 🎜🎜🎜
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!
Déclaration
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Golang obtient une concurrence efficace par le goroutine et le canal: 1. Goroutine est un fil léger, commencé avec le mot clé GO; 2. Le canal est utilisé pour une communication sécurisée entre les Goroutines afin d'éviter les conditions de course; 3. L'exemple d'utilisation montre une utilisation de base et avancée; 4. Les erreurs courantes incluent des impasses et une concurrence de données, qui peuvent être détectées par Gorun-Race; 5. L'optimisation des performances suggère de réduire l'utilisation du canal, de définir raisonnablement le nombre de goroutines et d'utiliser Sync.Pool pour gérer la mémoire.
Golang convient plus à la programmation système et aux applications de concurrence élevées, tandis que Python est plus adapté à la science des données et au développement rapide. 1) Golang est développé par Google, en tapant statiquement, mettant l'accent sur la simplicité et l'efficacité, et convient aux scénarios de concurrence élevés. 2) Python est créé par Guidovan Rossum, dynamiquement typé, syntaxe concise, large application, adaptée aux débutants et au traitement des données.
Golang est meilleur que Python en termes de performances et d'évolutivité. 1) Les caractéristiques de type compilation de Golang et le modèle de concurrence efficace le font bien fonctionner dans des scénarios de concurrence élevés. 2) Python, en tant que langue interprétée, s'exécute lentement, mais peut optimiser les performances via des outils tels que Cython.
Le langage GO présente des avantages uniques dans la programmation simultanée, les performances, la courbe d'apprentissage, etc .: 1. La programmation simultanée est réalisée via Goroutine et Channel, qui est légère et efficace. 2. La vitesse de compilation est rapide et les performances de l'opération sont proches de celles du langage C. 3. La grammaire est concise, la courbe d'apprentissage est lisse et l'écosystème est riche.
Les principales différences entre Golang et Python sont les modèles de concurrence, les systèmes de type, les performances et la vitesse d'exécution. 1. Golang utilise le modèle CSP, qui convient aux tâches simultanées élevées; Python s'appuie sur le multi-threading et Gil, qui convient aux tâches à forte intensité d'E / S. 2. Golang est un type statique, et Python est un type dynamique. 3. La vitesse d'exécution du langage compilée de Golang est rapide, et le développement du langage interprété par Python est rapide.
Golang est généralement plus lent que C, mais Golang présente plus d'avantages dans l'efficacité de programmation et de développement simultanée: 1) Le modèle de collecte et de concurrence de Golang de Golang le fait bien fonctionner dans des scénarios à haute concurrence; 2) C obtient des performances plus élevées grâce à la gestion manuelle de la mémoire et à l'optimisation matérielle, mais a une complexité de développement plus élevée.
Golang est largement utilisé dans le cloud computing et DevOps, et ses avantages résident dans la simplicité, l'efficacité et les capacités de programmation simultanées. 1) Dans le cloud computing, Golang gère efficacement les demandes simultanées via les mécanismes de goroutine et de canal. 2) Dans DevOps, les fonctionnalités de compilation rapide de Golang et de plate-forme en font le premier choix pour les outils d'automatisation.
SecLists est le compagnon ultime du testeur de sécurité. Il s'agit d'une collection de différents types de listes fréquemment utilisées lors des évaluations de sécurité, le tout en un seul endroit. SecLists contribue à rendre les tests de sécurité plus efficaces et productifs en fournissant facilement toutes les listes dont un testeur de sécurité pourrait avoir besoin. Les types de listes incluent les noms d'utilisateur, les mots de passe, les URL, les charges utiles floues, les modèles de données sensibles, les shells Web, etc. Le testeur peut simplement extraire ce référentiel sur une nouvelle machine de test et il aura accès à tous les types de listes dont il a besoin.