Maison base de données tutoriel mysql mysql连接hang住问题分析_MySQL

mysql连接hang住问题分析_MySQL

Jun 01, 2016 pm 01:34 PM
mysql 多线程 数据库

bitsCN.com

mysql连接hang住问题分析

 

【问题现象】:

 

1.       Linuxc多线程连接mysql数据库,每次都是短连接,操作完后就释放连接,有时候会出现mysql_real_connect挂住的现象

 

2.       挂住超时mysql_real_connect返回后报错如下:Lostconnection to MySQL server at 'reading initial communication packet', systemerror: 104,返错后线程号没变,会继续往下运行

 

【初步原因分析】:

 

1.       mysql_real_connect连接数据库, 没有显式调用超时时间,重连什么的,使用的默认值:

 

2.       昨天拿c   mysqlclient的源码进行了分析测试,发现以下几个配置项的默认值(如果调mysql_real_connect之前没有设置任何属性,mysql client端的机器上/etc/my.cnf也没有配置)如下:

 

connect_timeout = 0

 

read_timeout = 0

 

write_timeout = 0

 

reconnect = 0  //1表示自动重连

 

所以这些参数是需要显式设置的。

 

{net = {vio = 0x7b8f150, options = {connect_timeout = 0, read_timeout = 0, write_timeout = 0,}

 

3.       Mysqlclient中报错的代码如下(与服务端连接建立后,读解析包的时候失败了):

 

  /*

 

    Part 1: Connection established, read and parse first packet

 

  */

 

if ((pkt_length=cli_safe_read(mysql)) == packet_error)

 

  {

 

    if (mysql->net.last_errno == CR_SERVER_LOST)

 

      set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate,

 

                               ER(CR_SERVER_LOST_EXTENDED),

 

                               "reading initial communication packet",

 

                               errno);

 

         fprintf(myfp,"%s after cli_safe_read packet_error /n",cur_time());

 

    goto error;

 

  }

 

线程阻塞时抓到的堆栈如下:

 

#0  0x0000003ebe0c5f3b in read () from /lib64/libc.so.6

 

#1  0x00007f240dd91430 in vio_read () from /usr/lib/libmysql.so.16.0.0

 

#2  0x00007f240dcf9b05 in my_real_read () from /usr/lib/libmysql.so.16.0.0

 

#3  0x00007f240dcf9e38 in my_net_read () from /usr/lib/libmysql.so.16.0.0

 

#4  0x00007f240dcec396 in cli_safe_read () from /usr/lib/libmysql.so.16.0.0

 

#5  0x00007f240dceea17 in mysql_real_connect () from /usr/lib/libmysql.so.16.0.0

 

4.       似乎根本原因是为什么阻塞在了read函数上,并且没有超时返回

 

size_t vio_read(Vio * vio, uchar* buf, size_t size)

 

{

 

  size_t r;

 

  DBUG_ENTER("vio_read");

 

  DBUG_PRINT("enter", ("sd: %d  buf: 0x%lx  size: %u", vio->sd, (long) buf,

 

                       (uint) size));

 

 

 

  /* Ensure nobody uses vio_read_buff and vio_read simultaneously */

 

  DBUG_ASSERT(vio->read_end == vio->read_pos);

 

#ifdef __WIN__

 

  r = recv(vio->sd, buf, size,0);

 

#else

 

  errno=0;                                               /* For linux */

 

 r = read(vio->sd, buf, size);

 

#endif /* __WIN__ */

 

#ifndef DBUG_OFF

 

  if (r == (size_t) -1)

 

  {

 

    DBUG_PRINT("vio_error", ("Got error %d during read",errno));

 

  }

 

#endif /* DBUG_OFF */

 

  DBUG_PRINT("exit", ("%ld", (long) r));

 

  DBUG_RETURN(r);

 

}

 

5. 跟了下mysqlclient中与服务端连接读写socket的代码,发现配置的mysql_options中配置的MYSQL_OPT_READ_TIMEOUT和MYSQL_OPT_WRITE_TIMEOUT正是socket连接中的读写超时时间:

 

setsockopt(vio->sd, SOL_SOCKET, which ? SO_SNDTIMEO : SO_RCVTIMEO,

 

                IF_WIN(const char*, const void*)&wait_timeout,

 

                sizeof(wait_timeout))

 

这个超时时间默认是很大的值(31536000s),如果read阻塞了线程就会挂住,直到tcp的超时时间断开连接(默认2小时)

 

6.  mysql官网上有类似的说明:

 

http://dev.mysql.com/worklog/task/?id=1907

 

http://bugs.mysql.com/bug.php?id=4143

 

7.  数据库读/写超时可以通过调用mysql_options()设置,具体参数为MYSQL_OPT_READ_TIMEOUT和MYSQL_OPT_WRITE_TIMEOUT。

 

MYSQL_OPT_READ_TIMEOUT (argument type: unsigned int *) 

The timeout in seconds for attempts to read from the server. Each attempt usesthis timeout value and there are retries if necessary, so the total effectivetimeout value is three times the option value. You can set the value so that alost connection can be detected earlier than the TCP/IP Close_Wait_Timeoutvalue of 10 minutes. Before MySQL 5.1.41, this option applies only to TCP/IPconnections and, prior to MySQL 5.1.12, only for Windows. 

 

MYSQL_OPT_WRITE_TIMEOUT (argument type: unsigned int *) 

The timeout in seconds for attempts to write to the server. Each attempt usesthis timeout value and there are net_retry_count retries if necessary, so thetotal effective timeout value is net_retry_count times the option value. BeforeMySQL 5.1.41, this option applies only to TCP/IP connections and, prior toMySQL 5.1.12, only for Windows. 

 

然而,值得注意的是此两个参数并不是对所有版本都支持:

 

Before MySQL 5.1.41, this option applies only to TCP/IPconnections and, prior to MySQL 5.1.12, only for Windows.

 

对于linux系统来说,你必须使用官方发布的5.1.12版本之后的客户端库,否则你需要自己编译线程安全的客户端库。

 

bitsCN.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment optimiser les performances des requêtes MySQL en PHP ? Comment optimiser les performances des requêtes MySQL en PHP ? Jun 03, 2024 pm 08:11 PM

Les performances des requêtes MySQL peuvent être optimisées en créant des index qui réduisent le temps de recherche d'une complexité linéaire à une complexité logarithmique. Utilisez PreparedStatements pour empêcher l’injection SQL et améliorer les performances des requêtes. Limitez les résultats des requêtes et réduisez la quantité de données traitées par le serveur. Optimisez les requêtes de jointure, notamment en utilisant des types de jointure appropriés, en créant des index et en envisageant l'utilisation de sous-requêtes. Analyser les requêtes pour identifier les goulots d'étranglement ; utiliser la mise en cache pour réduire la charge de la base de données ; optimiser le code PHP afin de minimiser les frais généraux.

Comment corriger les erreurs mysql_native_password non chargé sur MySQL 8.4 Comment corriger les erreurs mysql_native_password non chargé sur MySQL 8.4 Dec 09, 2024 am 11:42 AM

L'un des changements majeurs introduits dans MySQL 8.4 (la dernière version LTS en 2024) est que le plugin « MySQL Native Password » n'est plus activé par défaut. De plus, MySQL 9.0 supprime complètement ce plugin. Ce changement affecte PHP et d'autres applications

Comment créer une table MySQL en utilisant PHP ? Comment créer une table MySQL en utilisant PHP ? Jun 04, 2024 pm 01:57 PM

La création d'une table MySQL à l'aide de PHP nécessite les étapes suivantes : Connectez-vous à la base de données. Créez la base de données si elle n'existe pas. Sélectionnez une base de données. Créer un tableau. Exécutez la requête. Fermez la connexion.

Défis et contre-mesures de la gestion de la mémoire C++ dans un environnement multithread ? Défis et contre-mesures de la gestion de la mémoire C++ dans un environnement multithread ? Jun 05, 2024 pm 01:08 PM

Dans un environnement multithread, la gestion de la mémoire C++ est confrontée aux défis suivants : courses de données, blocages et fuites de mémoire. Les contre-mesures incluent : 1. L'utilisation de mécanismes de synchronisation, tels que les mutex et les variables atomiques ; 2. L'utilisation de structures de données sans verrouillage ; 3. L'utilisation de pointeurs intelligents ; 4. (Facultatif) La mise en œuvre du garbage collection ;

Tutoriel détaillé sur l'établissement d'une connexion à une base de données à l'aide de MySQLi en PHP Tutoriel détaillé sur l'établissement d'une connexion à une base de données à l'aide de MySQLi en PHP Jun 04, 2024 pm 01:42 PM

Comment utiliser MySQLi pour établir une connexion à une base de données en PHP : Inclure l'extension MySQLi (require_once) Créer une fonction de connexion (functionconnect_to_db) Appeler la fonction de connexion ($conn=connect_to_db()) Exécuter une requête ($result=$conn->query()) Fermer connexion ( $conn->close())

iOS 18 ajoute une nouvelle fonction d'album 'Récupéré' pour récupérer les photos perdues ou endommagées iOS 18 ajoute une nouvelle fonction d'album 'Récupéré' pour récupérer les photos perdues ou endommagées Jul 18, 2024 am 05:48 AM

Les dernières versions d'Apple des systèmes iOS18, iPadOS18 et macOS Sequoia ont ajouté une fonctionnalité importante à l'application Photos, conçue pour aider les utilisateurs à récupérer facilement des photos et des vidéos perdues ou endommagées pour diverses raisons. La nouvelle fonctionnalité introduit un album appelé "Récupéré" dans la section Outils de l'application Photos qui apparaîtra automatiquement lorsqu'un utilisateur a des photos ou des vidéos sur son appareil qui ne font pas partie de sa photothèque. L'émergence de l'album « Récupéré » offre une solution aux photos et vidéos perdues en raison d'une corruption de la base de données, d'une application d'appareil photo qui n'enregistre pas correctement dans la photothèque ou d'une application tierce gérant la photothèque. Les utilisateurs n'ont besoin que de quelques étapes simples

Comment Go WebSocket s'intègre-t-il aux bases de données ? Comment Go WebSocket s'intègre-t-il aux bases de données ? Jun 05, 2024 pm 03:18 PM

Comment intégrer GoWebSocket à une base de données : Configurer une connexion à la base de données : Utilisez le package database/sql pour vous connecter à la base de données. Stocker les messages WebSocket dans la base de données : utilisez l'instruction INSERT pour insérer le message dans la base de données. Récupérer les messages WebSocket de la base de données : utilisez l'instruction SELECT pour récupérer les messages de la base de données.

Comment gérer les erreurs de connexion à la base de données en PHP Comment gérer les erreurs de connexion à la base de données en PHP Jun 05, 2024 pm 02:16 PM

Pour gérer les erreurs de connexion à la base de données en PHP, vous pouvez utiliser les étapes suivantes : Utilisez mysqli_connect_errno() pour obtenir le code d'erreur. Utilisez mysqli_connect_error() pour obtenir le message d'erreur. En capturant et en enregistrant ces messages d'erreur, les problèmes de connexion à la base de données peuvent être facilement identifiés et résolus, garantissant ainsi le bon fonctionnement de votre application.

See all articles