返回顶部
首页 > 资讯 > 数据库 >线程简介和MySQL调试环境的搭建
  • 215
分享到

线程简介和MySQL调试环境的搭建

2024-04-02 19:04:59 215人浏览 独家记忆
摘要

本篇内容介绍了“线程简介和Mysql调试环境的搭建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、线程简

本篇内容介绍了“线程简介和Mysql调试环境的搭建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、线程简介

我们知道mysqlD是一个单进程多线程的用户程序,因此我们有必要了解一下什么线程。实际上Mysql中的线程都是POSIX线程,比如我们的会话线程、DUMP线程、io线程以及其他一些Innodb线程都是POSIX线程。

进程实际上就是运行中的程序,一个进程中可以包含多个线程也可以只包含一个线程。在linux中线程也叫轻量级进程(light-weight process)简称为LWP,进程的第一个线程通常称为主控线程。进程是内存分配的最小单位,线程是CPU调度的最小单位,也就是说如果CPU有足够多核,那么多个线程可以达到并行处理的效果,内核直接调度线程。下面是我学习Linux线程的时候看到的一张我认为比较好理解的图,我重新画了一下放在下面供大家参考(图29-1,高清原图包含在文末原图中):
线程简介和MySQL调试环境的搭建

一个进程内部的所有线程都拥有相同的代码程序、堆、全局变量、共享库等,但是每个线程拥有自己独立栈空间和寄存器,他们共享进程的虚拟内存地址空间。下面我们假定是32位操作系统下的MySQLD进程,它的进程虚拟内存地址示意图如下,实际上这个图也是参考《Linux UNIX系统编程手册》画的(图29-2,高清原图包含在文末原图中):

线程简介和MySQL调试环境的搭建

我们发现线程的堆内存和全局变量是共享的,因此线程之间数据共享很轻松,但是要控制好这些共享内存就需要引入我们的线程同步技术,比如我们常说的Mutex。

如果想了解线程到底共享了哪些资源,线程和进程到底各有什么优势和劣势,可执行参考上面我给出的书籍。

二、PID、LWP ID、Thread TID

如果要进行调试就需要了解这三种ID,其中PID和LWP ID是比较重要,因为不管是调试和运维都会遇到它们,而Thread TID不做多线程开发一般很少用到,下面是我对它们的总结

  • PID:内核分配,用于识别各个进程的ID。这个应该是大家最熟悉的。

  • LWP ID:内核分配,用于识别各个线程的ID,它就像是线程是‘PID’一样。同一个进程下的所有线程有相同的PID,但是LWP ID却不一样,主控线程的LWP ID就是进程PID。

  • Thread TID:进程内部用于识别各个线程的内部ID,这个ID用得不多。

下面我写了一个简单的C测试程序仅仅用于观察这些ID,它是通过主控线程再创建一个线程,也就是说这个进程包含了两个线程。它们分别打印自己的PID、LWP ID、Thread TID,然后做一个循环自加操作引起高CPU消耗现象便于观察。然后我们使用Linux的top -H和ps -eLlf命令分别进行观察。

  1. 程序输出

下面是程序的输出:

# ./gaopengtest 
main thread: pid 13188 tid 2010470144 lwp 13188
new thread:  pid 13188 tid 2010461952 lwp 13189

我们可以看到两个线程的PID都是13188,但是主控线程的LWP ID是13188,新建立的一个线程LWP ID是13189。然后就是Thread TID了,不过多解释。

  1. top -H 观察如下:

我们可以看到这两个线程都是高耗CPU的线程,CPU已经处于饱和状态。这里我们看到top -H命令的输出中‘PID’就是LWP ID。这里我们还能看它们的内存信息完全一致,内存信息实际上是整个进程的内存信息,因为进程是内存分配的最小单位嘛。

线程简介和MySQL调试环境的搭建

注意如果这个时候查看这个进程占用的%cpu就超过了100%,接近200%,如下:

线程简介和MySQL调试环境的搭建

  1. ps -eLlf 观察如下:

我们可以看到这里包含了PID和LWP ID,不过多解释了,大家可以自己去试试。

线程简介和MySQL调试环境的搭建

三、如何将MySQL的线程和LWP ID进行对应

在5.7中我们已经可以通过MySQL语句和LWP ID进行对应了,这让性能诊断变得更加便捷。比如我上面的列子如果两个高耗CPU的线程是MySQL的线程那么我们就拿到了线程的LWP ID,然后可以通过语句找到这两个线程到底是MySQL的什么线程。语句如下:

mysql> select a.thd_id,b.THREAD_OS_ID,a.user 
,b.TYPE from  sys.processlist 
a,perfORMance_schema.threads  b where b.thread_id=a.thd_id;
+--------+--------------+---------------------------+---------+------------
| thd_id | THREAD_OS_ID | user                      | conn_id | TYPE       
+--------+--------------+---------------------------+---------+------------
|      1 |        16370 | sql/main                  |    NULL | BACKGROUND 
|      2 |        17202 | sql/thread_timer_notifier |    NULL | BACKGROUND 
|      3 |        17207 | innodb/io_ibuf_thread     |    NULL | BACKGROUND 
|      4 |        17208 | innodb/io_log_thread      |    NULL | BACKGROUND 
|      5 |        17209 | innodb/io_read_thread     |    NULL | BACKGROUND 
|      6 |        17210 | innodb/io_read_thread     |    NULL | BACKGROUND 
|      7 |        17211 | innodb/io_read_thread     |    NULL | BACKGROUND 
|      8 |        17212 | innodb/io_read_thread     |    NULL | BACKGROUND 
|      9 |        17213 | innodb/io_read_thread     |    NULL | BACKGROUND 
|     10 |        17214 | innodb/io_read_thread     |    NULL | BACKGROUND 
|     11 |        17215 | innodb/io_read_thread     |    NULL | BACKGROUND 
|     12 |        17216 | innodb/io_read_thread     |    NULL | BACKGROUND 
|     13 |        17217 | innodb/io_write_thread    |    NULL | BACKGROUND 
|     14 |        17218 | innodb/io_write_thread    |    NULL | BACKGROUND 
|     15 |        17219 | innodb/io_write_thread    |    NULL | BACKGROUND 
|     16 |        17220 | innodb/io_write_thread    |    NULL | BACKGROUND 
|     17 |        17221 | innodb/io_write_thread    |    NULL | BACKGROUND 
......

这里的THREAD_OS_ID就是线程的LWP ID。然后我们使用刚才的ps -eLlf命令再看一下,如下:

线程简介和MySQL调试环境的搭建

我们可以发现他们是可以对应上的,这个最好自己实际试试就知道了。

四、调试环境搭建

调试环境的搭建我认为不管使用什么方法只要能够起到调试的作用就可以了。这里介绍一下我的方法。我是在Linux下面直接使用gdb调试的,我觉得这个方法搭建非常简单并且很奏效,基本上只要会源码安装就能完成调试环境的搭建。下面来看看步骤:

1. 第一步下载MySQL源码包,解压。

我特意重新下载了官方版的5.7.26源码。

2. 使用源码安装的方法安装MySQL,注意需要开启debug选项

下面是我使用的选项:

cmake -DCMAKE_INSTALL_PREFIX=/root/sf/mysql3312/ -DMYSQL_DATADIR=/root/sf/mysql3312/data/ -DSYSCONFDIR=/root/sf/mysql3312/ -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHive_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1  -DMYSQL_UNIX_ADDR=/root/sf/mysql3312/mysql3312.sock -DMYSQL_tcp_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8  -DDEFAULT_COLLATION=utf8_general_ci  -DMYSQL_USER=mysql  -DWITH_BINLOG_PREALLOC=ON   -DWITH_BOOST=/root/sf/mysql-5.7.26/boost/boost_1_59_0 -DWITH_DEBUG=1

注意最后的-DWITH_DEBUG=1必须开启。

3. make&&make install

编译和安装。

4. 准备参数文件和初始化MySQL数据库,并且确保能成功启动

这一步自己处理,注意权限。我的环境启动成功了如下:

[root@gp1 support-files]# ./mysql.server start
Starting MySQL....... SUCCESS! 
[root@gp1 support-files]# ./mysql.server stop
Shutting down MySQL.. SUCCESS!

5. 准备gdb命令文件

如下是我准备的命令文件:

[root@gp1 ~]# more debug.file 
break main
run --defaults-file=/root/sf/mysql3312/my.cnf --user=mysql --gdb

第一行是在main函数处打一个断点。第二行就是gdb调用MySQLD的时候,MySQLD加什么参数了,注意run不要写掉了。

6.使用gdb启动MySQL

使用如下命令启动调试环境:

gdb -x /root/debug.file /root/sf/mysql3312/bin/mysqld

下面就是我启动调试环境成功的记录:

# gdb -x /root/debug.file /root/sf/mysql3312/bin/mysqld
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-92.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <Http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and Redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/sf/mysql3312/bin/mysqld...done.
Breakpoint 1 at 0xec7c53: file /root/sf/mysql-5.7.26/sql/main.cc, line 25.
[Thread debugging using libthread_db enabled]
Breakpoint 1, main (arGC=5, argv=0x7fffffffe3b8) at /root/sf/mysql-5.7.26/sql/main.cc:25
25        return mysqld_main(argc, argv);
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.212.el6.x86_64 libaio-0.3.107-10.el6.x86_64 libgcc-4.4.7-18.el6.x86_64 libstdc++-4.4.7-18.el6.x86_64 nss-softokn-freebl-3.14.3-23.3.el6_8.x86_64
(gdb) c
Continuing.
[New Thread 0x7fffee883700 (LWP 29375)]
[New Thread 0x7fff9a9f3700 (LWP 29376)]
[New Thread 0x7fff99ff2700 (LWP 29377)]
[New Thread 0x7fff995f1700 (LWP 29378)]
[New Thread 0x7fff98bf0700 (LWP 29379)]
[New Thread 0x7fff981ef700 (LWP 29380)]
[New Thread 0x7fff977ee700 (LWP 29381)]
[New Thread 0x7fff96ded700 (LWP 29382)]
[New Thread 0x7fff963ec700 (LWP 29383)]
.....

注意到了这里的LWP ID了吗,前面我们已经讨论过了。这个时候MySQL客户端程序已经可以连接MySQLD了如下:

# /root/sf/mysql3312/bin/mysql -S'/root/sf/mysql3312/mysql3312.sock'
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26-debug-log Source distribution
Copyright (c) 2000, 2019, oracle and/or its affiliates. All rights reserved.
Oracle is a reGIStered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select version() ;
+------------------+
| version()        |
+------------------+
| 5.7.26-debug-log |
+------------------+
1 row in set (0.00 sec)

好了到这里基本的调试环境就搭建起来了,我们可以发现很简单。之后我们就可以进行断点调试了。我常用的gdb命令包含:

  • info threads:查看全部线程

  • thread n:指定某个线程

  • bt:查看某个线程栈帧

  • b:设置断点

  • c:继续执行

  • s:执行一行代码,如果代码函数调用,则进入函数

  • n:执行一行代码,函数调用不进入

  • p:打印某个变量值

  • list:打印代码的文本信息

当然gdb还有很多命令,可自行参考其他资料。

六、使用调试环境证明问题的一个列子

这里我们就用一个例子来看看调试环境的使用方法。我们前面第15节说过binlog cache是在order commit的flush阶段才写入到binary log的,调用的是函数binlog_cache_data::flush。好了我们可以将断点打到这个函数如下:

(gdb) b binlog_cache_data::flush
Breakpoint 2 at 0x1846333: file /root/sf/mysql-5.7.26/sql/binlog.cc, line 1674.

然后我们在MySQL客户端执行一个事物如下,并且提交:

mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into gpdebug values(1);
Query OK, 1 row affected (0.03 sec)
mysql> commit;

commit的时候已经卡主了,断点触发如下:

Breakpoint 2, binlog_cache_data::flush (this=0x7fff3c00df20...)
    at /root/sf/mysql-5.7.26/sql/binlog.cc:1674
1674      DBUG_ENTER("binlog_cache_data::flush");

我们使用bt命令查看栈帧发现如下:

#0  binlog_cache_data::flush
at /root/sf/mysql-5.7.26/sql/binlog.cc:1674
#1  0x0000000001861b41 in binlog_cache_mngr::flush 
at /root/sf/mysql-5.7.26/sql/binlog.cc:967
#2  0x00000000018574ce in MYSQL_BIN_LOG::flush_thread_caches 
at /root/sf/mysql-5.7.26/sql/binlog.cc:8894
#3  0x0000000001857712 in MYSQL_BIN_LOG::process_flush_stage_queue 
at /root/sf/mysql-5.7.26/sql/binlog.cc:8957
#4  0x0000000001858d19 in MYSQL_BIN_LOG::ordered_commit 
at /root/sf/mysql-5.7.26/sql/binlog.cc:9595
#5  0x00000000018573b4 in MYSQL_BIN_LOG::commit
at /root/sf/mysql-5.7.26/sql/binlog.cc:8851
#6  0x0000000000f58de9 in ha_commit_trans 
at /root/sf/mysql-5.7.26/sql/handler.cc:1799
#7  0x000000000169e02b in trans_commit 
at /root/sf/mysql-5.7.26/sql/transaction.cc:239
......

好了看到这个栈帧,就能证明我们的说法了,如果想深入学习代码就可以从这个栈帧出发进行学习。但是值得注意的是,这是建立在知道函数接口功能的前提下的,如果我们不知道写入binary log会调用binlog_cache_data::flush函数那么调试也就不好进行了,我就经常遇到这样的困境。因此整个系列我给出了很多这样的接口,供有兴趣的朋友调试和测试。

“线程简介和MySQL调试环境的搭建”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: 线程简介和MySQL调试环境的搭建

本文链接: https://lsjlt.com/news/60209.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 线程简介和MySQL调试环境的搭建
    本篇内容介绍了“线程简介和MySQL调试环境的搭建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、线程简...
    99+
    2024-04-02
  • MySQL InnoDB Cluster环境搭建和简单测试
    InnoDB Cluster初印象   记得MySQL Group Replicatioin 刚开始的时候,MySQL界很是轰动,等待了多年,终于有了官方的这个高可用解决方案。你要说还...
    99+
    2024-04-02
  • mysql源码调试(一)环境搭建
    操作系统:windows server 2012 R2VS版本:visio studio 2015 community机器配置:4core/4G安装所需包:cmake,bison,boost,activep...
    99+
    2024-04-02
  • docke-cli的调试环境搭建过程
    目录搭建docke-cli的调试环境1. 安装go开发环境2. 修改部分go 环境变量3. 创建目录4.下载代码5. 配置VScode搭建docke-cli的调试环境 在搭建dock...
    99+
    2022-11-16
    docke cli调试环境 docker调试环境 搭建docke cli
  • java简介及环境搭建
    目录1.1java简介1.2sun公司1.3java发展历史1.4java相关的词汇1.5java程序编译运行过程1.6测试java开发环境1.7Java第一个程序编写并编译运行(1...
    99+
    2024-04-02
  • plsql的环境与介绍:环境的搭建和plsql的简单介绍
    PLSQL编程1.环境的搭建(1)创建一个存储表空间SQL> conn /as sysdbaConnected.SQL> create tablespace plsql datafile '/u...
    99+
    2024-04-02
  • JSP 简介,环境搭建和JSP特性
    JSP 简介什么是Java Server Pages(Java服务器页面)JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。JS...
    99+
    2023-06-02
  • X86汇编调试环境搭建的过程
    最近毕设需要做一个基于X86的微型OS内核,一直在学习汇编,前来记录一下 汇编环境搭建 本次使用vscode搭建的,需要的插件有X86 and X86_64 Assembly(也可以...
    99+
    2024-04-02
  • linux php调试环境怎么搭建
    本文操作环境:ubuntu 16.04系统,PHP7.1版,Dell G3电脑。linux php调试环境怎么搭建?Linux的PHP开发环境快速搭建搭建的环境是LNMP:1、安装MySQL这个非常简单我用的是Ubuntu那么就用apt源,...
    99+
    2015-01-12
    linux
  • linux php调试环境如何搭建
    这篇文章主要讲解了“linux php调试环境如何搭建”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux php调试环境如何搭建”吧!linux php调试环境的搭建方法:1、下载安装...
    99+
    2023-06-22
  • 如何搭建X86汇编调试环境
    这篇文章将为大家详细讲解有关如何搭建X86汇编调试环境,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。汇编环境搭建本次使用vscode搭建的,需要的插件有X86 and X86_64 Assembly(也可...
    99+
    2023-06-25
  • vs2022 qt环境搭建调试的方法步骤
    建议:先安装qt再安装vs! 1、安装qt6,如下图,勾选msvc2019即可,其它自行决定,剩下安装自动的; 2、vs2022安装没什么说的,因为已经是模块化安装了,如下图,这是...
    99+
    2024-04-02
  • windows下使用vscode搭建golang环境并调试的过程
    目录安装环境变量配置运行helloword设置代理vscode编辑器调试golang一种语言会老吗? 我觉得会的,Objective-C语言变老了,就出现了 Swift语言。头号的语...
    99+
    2024-04-02
  • 搭建RocketMQ在本地IDEA开发调试环境教程
    目录前言生成安装包启动NameServer启动broker安装RocketMQConsole尽情的DEBUG前言 发现公司这边的消息中间件采用了aliyun的RocketMQ服务,熟...
    99+
    2024-04-02
  • React-Native 环境搭建和基本介绍
    环境搭建准备 1.环境搭建 React Native中文网 2.开发工具 前端开发软件:Visual Studio Code 移动端开发软件:Xcode、Android Studio...
    99+
    2024-04-02
  • 搭建PhpStorm+phpStudy+XDebug调试环境的,保姆级能用教程。
    最近换到phpstorm IDE,发现洁面好用,但是初次搭建调试环境,大费周章。 百度一搜几百篇,但是真正能用的一篇难寻。查阅了JetBrains官方文档,也只有粗略介绍。 phpstorm 自带的s...
    99+
    2023-09-04
    phpstorm php
  • 如何搭建MySQL Group Replication测试环境
    这篇文章给大家分享的是有关如何搭建MySQL Group Replication测试环境的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。    最近看了下My...
    99+
    2024-04-02
  • PHP如何搭配环境和调试代码
    这篇文章主要介绍了PHP如何搭配环境和调试代码,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、第一讲 php环境的搭配和代码调试1、Php...
    99+
    2024-04-02
  • Lamp环境中如何搭建Mysql与PHP环境的搭建
    今天就跟大家聊聊有关  Lamp环境中如何搭建Mysql与PHP环境的搭建,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 Lam...
    99+
    2024-04-02
  • VSCode 搭建 x264 源码调试环境的详细步骤
    目录1.下载 x2642. 使用上一节介绍的方法为 x264 生成支持 debug 的 x264.exe3. 在 VSCode 中打开 x264 源码文件夹4. 创建并配置 laun...
    99+
    2022-11-13
    VSCode源码调试 VSCode  x264 源码调试
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作