데이터 베이스 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
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP에서 MySQL 쿼리 성능을 최적화하는 방법은 무엇입니까? PHP에서 MySQL 쿼리 성능을 최적화하는 방법은 무엇입니까? Jun 03, 2024 pm 08:11 PM

선형 복잡성에서 로그 복잡성까지 조회 시간을 줄이는 인덱스를 구축하여 MySQL 쿼리 성능을 최적화할 수 있습니다. SQL 삽입을 방지하고 쿼리 성능을 향상하려면 PREPAREDStatements를 사용하세요. 쿼리 결과를 제한하고 서버에서 처리되는 데이터의 양을 줄입니다. 적절한 조인 유형 사용, 인덱스 생성, 하위 쿼리 사용 고려 등 조인 쿼리를 최적화합니다. 쿼리를 분석하여 병목 현상을 식별하고, 캐싱을 사용하여 데이터베이스 로드를 줄이고, 오버헤드를 최소화합니다.

MySQL 8.4에서 mysql_native_password가 로드되지 않음 오류를 수정하는 방법 MySQL 8.4에서 mysql_native_password가 로드되지 않음 오류를 수정하는 방법 Dec 09, 2024 am 11:42 AM

MySQL 8.4(2024년 최신 LTS 릴리스)에 도입된 주요 변경 사항 중 하나는 "MySQL 기본 비밀번호" 플러그인이 더 이상 기본적으로 활성화되지 않는다는 것입니다. 또한 MySQL 9.0에서는 이 플러그인을 완전히 제거합니다. 이 변경 사항은 PHP 및 기타 앱에 영향을 미칩니다.

PHP를 사용하여 MySQL 테이블을 만드는 방법은 무엇입니까? PHP를 사용하여 MySQL 테이블을 만드는 방법은 무엇입니까? Jun 04, 2024 pm 01:57 PM

PHP를 사용하여 MySQL 테이블을 생성하려면 다음 단계가 필요합니다. 데이터베이스에 연결합니다. 데이터베이스가 없으면 작성하십시오. 데이터베이스를 선택합니다. 테이블을 생성합니다. 쿼리를 실행합니다. 연결을 닫습니다.

멀티스레드 환경에서 C++ 메모리 관리의 과제와 대책은? 멀티스레드 환경에서 C++ 메모리 관리의 과제와 대책은? Jun 05, 2024 pm 01:08 PM

다중 스레드 환경에서 C++ 메모리 관리는 데이터 경합, 교착 상태 및 메모리 누수와 같은 문제에 직면합니다. 대책에는 다음이 포함됩니다. 1. 뮤텍스 및 원자 변수와 같은 동기화 메커니즘을 사용합니다. 2. 잠금 없는 데이터 구조를 사용합니다. 3. 스마트 포인터를 사용합니다. 4. (선택 사항) 가비지 수집을 구현합니다.

PHP에서 MySQLi를 사용하여 데이터베이스 연결을 설정하는 방법에 대한 자세한 튜토리얼 PHP에서 MySQLi를 사용하여 데이터베이스 연결을 설정하는 방법에 대한 자세한 튜토리얼 Jun 04, 2024 pm 01:42 PM

MySQLi를 사용하여 PHP에서 데이터베이스 연결을 설정하는 방법: MySQLi 확장 포함(require_once) 연결 함수 생성(functionconnect_to_db) 연결 함수 호출($conn=connect_to_db()) 쿼리 실행($result=$conn->query()) 닫기 연결( $conn->close())

iOS 18에는 손실되거나 손상된 사진을 검색할 수 있는 새로운 '복구된' 앨범 기능이 추가되었습니다. iOS 18에는 손실되거나 손상된 사진을 검색할 수 있는 새로운 '복구된' 앨범 기능이 추가되었습니다. Jul 18, 2024 am 05:48 AM

Apple의 최신 iOS18, iPadOS18 및 macOS Sequoia 시스템 릴리스에는 사진 애플리케이션에 중요한 기능이 추가되었습니다. 이 기능은 사용자가 다양한 이유로 손실되거나 손상된 사진과 비디오를 쉽게 복구할 수 있도록 설계되었습니다. 새로운 기능에는 사진 앱의 도구 섹션에 '복구됨'이라는 앨범이 도입되었습니다. 이 앨범은 사용자가 기기에 사진 라이브러리에 포함되지 않은 사진이나 비디오를 가지고 있을 때 자동으로 나타납니다. "복구된" 앨범의 출현은 데이터베이스 손상으로 인해 손실된 사진과 비디오, 사진 라이브러리에 올바르게 저장되지 않은 카메라 응용 프로그램 또는 사진 라이브러리를 관리하는 타사 응용 프로그램에 대한 솔루션을 제공합니다. 사용자는 몇 가지 간단한 단계만 거치면 됩니다.

PHP에서 데이터베이스 연결 오류를 처리하는 방법 PHP에서 데이터베이스 연결 오류를 처리하는 방법 Jun 05, 2024 pm 02:16 PM

PHP에서 데이터베이스 연결 오류를 처리하려면 다음 단계를 사용할 수 있습니다. mysqli_connect_errno()를 사용하여 오류 코드를 얻습니다. 오류 메시지를 얻으려면 mysqli_connect_error()를 사용하십시오. 이러한 오류 메시지를 캡처하고 기록하면 데이터베이스 연결 문제를 쉽게 식별하고 해결할 수 있어 애플리케이션이 원활하게 실행될 수 있습니다.

Go WebSocket은 데이터베이스와 어떻게 통합됩니까? Go WebSocket은 데이터베이스와 어떻게 통합됩니까? Jun 05, 2024 pm 03:18 PM

GoWebSocket을 데이터베이스와 통합하는 방법: 데이터베이스 연결 설정: 데이터베이스/sql 패키지를 사용하여 데이터베이스에 연결합니다. WebSocket 메시지를 데이터베이스에 저장: INSERT 문을 사용하여 데이터베이스에 메시지를 삽입합니다. 데이터베이스에서 WebSocket 메시지 검색: SELECT 문을 사용하여 데이터베이스에서 메시지를 검색합니다.

See all articles