数据库系列之MySQL线程ID和操作系统线程ID对应关系

『叶问』#40,MySQL进程号、连接ID、查询ID、InnoDB线程与系统线程如何对应 一文快速掌握 MySQL进程号、连接ID、查询ID、InnoDB线程与系统线程的对应关系。 有时候,怀疑某个MySQL内存查询导致CPU或磁盘I/O消耗特别高,但又不确定具体是哪个SQL引起的。 或者当InnoDB引擎内部有semaphore wait时,想知道具体是哪个线程/查询引起的。多说一下,当有semaphore wait事件超过600秒的话,InnoDB会发出crash信号: InnoDB: ###### Diagnostic info printed to the standard er 阅读详情

在日常运维工作中,MySQL数据库服务器出现SQL语句执行导致服务器CPU使用率突增,如何通过现有手段快速定位排查到哪个SQL语句,并采取应急措施。本文介绍基于传统的操作系统线程的CPU使用监控手段入手,利用操作系统线程ID和MySQL线程ID对应关系,逐步定位到异常SQL和事务。


1、操作系统进程和线程ID
1.1 MySQL单进程和多线程关系

MySQL是一个单进程多线程数据库,进程是正在运行的程序的实例,线程是操作系统能够进行运算调度的最小单位。

  • 进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。
  • 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程并行执行不同的任务。

MySQL数据库选择单进程多线程,是因为进程同一时间内并发很多线程给不同的CPU,线程共享相同的内存单元/内存地址空间, 由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快。

在这里插入图片描述

上图是MySQL存储引擎InnoDB的后台线程,在“InnoDB存储引擎解密”中详细介绍了。InnoDB后台线程主要用于维持服务器的正常运行和完成用户提交的任务,主要包括:master thread、page cleaner thread、purge thread、read thread、write thread、redo log thread、insert buffer thread、monitor thread、error monitor thread、lock monitor thread等。

1.1.1 Master Thread

Master thread是核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲、undo页的回收等。Master thread内部由多个循环组成,包括主循环、后台循环、刷新循环和暂停循环,master thread会根据数据库运行的状态在不同的循环之间切换。在InnoDB 1.0.x版本之前的主循环中,分两大部分操作:每秒钟的操作和每10秒钟的操作。

1)每秒一次的操作包括:

  • 日志缓冲刷新到磁盘,即使这个事务还没有提交(总是),这点解释了为什么再大的事务commit时都很快
  • 合并插入缓冲(可能),合并插入并不是每秒都发生,InnoDB会判断当前一秒内发生的IO次数是否小于5,如果是,则系统认为当前的IO压力很小,可以执行合并插入缓冲的操作。
  • 至多刷新100个InnoDB的缓冲池的脏页到磁盘(可能),这个刷新100个脏页也不是每秒都在做。

即使某个事务还没有提交,InnoDB存储引擎仍然每秒会将重做日志缓存中的内容刷新到redo log中。

2)每10秒一次的操作包括:

  • 刷新100个脏页到磁盘(可能);
  • 合并至多5个插入缓冲(总是);
  • 将日志缓冲刷新到磁盘(总是);
  • 删除无用的undo页(总是);
  • 产生一个检查点(checkpoing);

在以上过程中,InnoDB存储引擎会先判断过去10s内的磁盘IO操作是否小于200次,如果是InnoDB存储引擎认为当前有足够的磁盘IO操作能力,因此将100个脏页刷新到磁盘。接着,InnoDB存储引擎会合并插入缓冲,之后再将日志缓冲刷新到磁盘。最后InnoDB存储引擎会执行full purge操作,删除无用的undo页,它会先去判断当前系统中已被标记为删除的行是否可以删除,如果可以则可以立即将其删除。

在InnoDB 1.0.x版本之前,InnoDB存储引擎对于IO是有限制的,缓冲池向磁盘刷新做了一定的硬编码,随着磁盘硬件性能提高,这种方式会限制InnoDB对磁盘IO的性能。因此在1.0.x版本之后,InnoDB提供了参数innodb_io_capacity,用来表示磁盘IO的吞吐量,默认值为200。对于刷新到磁盘页的数量,会按照innodb_io_capacity的百分比进行控制:

  • 在合并插入缓冲时,合并插入缓冲的数量为innodb_io_capacity值的5%
  • 在从缓冲区刷新脏页时,刷新脏页的数量为innodb_io_capacity

命令show engine innodb status;可以查看master thread信息:

=====================================
2021-08-22 20:38:37 140186194323200 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 12 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 1 srv_active, 0 srv_shutdown, 255 srv_idle
srv_master_thread log flush and writes: 0
1.1.2 Purge Thread

事务被提交后,其使用的undo log可能不再需要,因此需要Purge Thread来回收已经使用并分配的undo页,它的作用是真正的删除记录和删除undo log。

比如语句delete from tb1 where pk=1;

  1. 将pk=1的记录标记为删除(delete-mark,infobits),数据库中pk=1的记录此时还是存在的,空间并没有被释放,该操作为同步操作(SQL执行完,也就标记完成了)
  2. Purge为后台线程(purge线程)异步操作,会真正的删除该记录,且空间被释放。purge线程是系统自动的,无法人工控制。

Page页标记为已删除的原因有两点:1)该事物可能需要回滚,先作保留;2)当事物1去删除pk=1且没有提交时,事物2要能看到pk=1的记录(事物的隔离性)。根据不同的过滤条件,对删除标记的处理也不一样,如下表所示:

在这里插入图片描述

因此,标记为delete-mark的记录最后会被purge线程回收,Purge会检测记录上是否有其他事物在引用undo,如果没有就可以删除。InnoDB 1.2版本开始,InnoDB支持多个purge thread,这样能够加快undo页的回收,同时离散的读取undo页也可以进一步提升磁盘的随机读取性能,目前MySQL 8.0版本中默认设置为4。

mysql> show variables like 'innodb_purge_threads';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_purge_threads | 4     |
+----------------------+-------+
1 row in set (0.00 sec)
1.1.3 Page Cleaner Thread

Page Cleaner Thread是在InnoDB 1.2.x版本新引入的,其作用是将之前版本中脏页的刷新操作都放入单独的线程中来完成,这样减轻了Master Thread的工作及对于用户查询线程的阻塞。

1.1.4 IO Thread

在InnoDB存储引擎中大量使用了异步IO来处理写IO请求,IO Thread的工作主要是负责这些IO请求的回调处理。InnoDB中有4种IO thread,分别为write、read、insert buffer和log IO thread:

  • write thread:负责数据库的写操作,可配置多个写线程
  • read thread:负责数据库的读取操作,可配置多个读线程
  • insert buffer thread: 主要负责插入缓冲区的合并操作
  • log thread:用于将重做日志刷新到log file中

通过命令SHOW ENGINE INNODB STATUS可以观察InnoDB中的IO Thread:

--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)
Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,
 ibuf aio reads:, log i/o's:, sync i/o's:
Pending flushes (fsync) log: 0; buffer pool: 0
854 OS file reads, 207 OS file writes, 38 OS fsyncs
0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s
1.2 获得系统中MySQL进程ID

Linux系统中获得MySQL进程ID方法很简单,使用命令ps -ef|grep mysqld就能看到其系统进程ID。如下所示进程MySQL运行的进行ID为1479:

[root@tango-GDB-DB01 ~]# ps -ef|grep mysqld
mysql      1479   1090  1 16:59 ?        00:00:03 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=tango-GDB-DB01.err --pid-file=/usr/local/mysql/data/tango-GDB-DB01.pid --socket=/tmp/mysql.sock
1.3 MySQL进程下线程ID信息

Linux中显示某个具体线程信息有以下几种方法:

1)TOP -H显示线程信息

top命令可以实时显示各个线程情况,调用top命令的“-H”选项,该选项会列出所有Linux线程。加上-p会筛选具体进程下面的线程信息,如下所示:

[root@tango-GDB-DB01 ~]# top -H -p 1479
top - 17:10:44 up 11 min,  2 users,  load average: 0.00, 0.05, 0.05
Threads:  39 total,   0 running,  39 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1867024 total,  1051452 free,   495804 used,   319768 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1185628 avail Mem 
   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                            
  1479 mysql     20   0 1318236 367380  16280 S  0.0 19.7   0:01.55 mysqld                                           
  1527 mysql     20   0 1318236 367380  16280 S  0.0 19.7   0:00.00 mysqld                                         
  1528 mysql     20   0 1318236 367380  16280 S  0.0 19.7   0:00.00 mysqld                                         

2)在ps命令中,“-T”选项可以开启线程查看

下面的命令列出了由进程号为1479的进程创建的所有线程。

ps -aT -p <pid>
[root@tango-GDB-DB01 ~]# ps -aT -p 1479
   PID   SPID TTY          TIME CMD
  1479   1479 ?        00:00:01 mysqld
  1479   1527 ?        00:00:00 mysqld
  1479   1528 ?        00:00:00 mysqld

3)命令ps -Lef查看线程

[root@tango-GDB-DB01 ~]# ps -Lef|grep 1479
UID         PID   PPID    LWP  C NLWP STIME TTY          TIME CMD
mysql      1479   1090   1479  0   39 16:59 ?        00:00:01 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=tango-GDB-DB01.err --pid-file=/usr/local/mysql/data/tango-GDB-DB01.pid --socket=/tmp/mysql.sock
mysql      1479   1090   1527  0   39 16:59 ?        00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=tango-GDB-DB01.err --pid-file=/usr/local/mysql/data/tango-GDB-DB01.pid --socket=/tmp/mysql.sock

上述命令中PID给出进程号、LWP显示线程ID、C表示CPU使用率、NLWP表示 线程组内线程的个数。

1.4 pstack查看线程堆栈信息

命令pstack可用来查看进程中的堆栈信息,需要注意的是运行pstack会短暂阻塞mysqld进程,所以请切勿在业务高峰期执行。

在这里插入图片描述

2、系统线程ID和MySQL线程ID对应关系
2.1 MySQL中的ProcessID和ThreadID

1)连接MySQL,并执行以下语句

[root@tango-GDB-DB01 local]# mysql -h192.168.112.121 -P3306 -uroot -p –A
mysql> begin;
mysql> begin;select count(1),sleep(2000) from tango.t2 for update;

2)show processlist查看processlist信息,找到processlist_id

mysql> show processlist;
+----+-----------------+----------------------+-------+---------+------+------------------------+-------------------------------------------+
| Id | User            | Host                 | db    | Command | Time | State                  | Info                                      |
+----+-----------------+----------------------+-------+---------+------+------------------------+-------------------------------------------+                                    |
| 10 | root            | tango-GDB-DB01:50620 | tango | Query   |   52 | User sleep             | select count(1),sleep(2000) from tango.t2 for update |
| 11 | root            | localhost            | NULL  | Query   |    0 | init                   | show processlist                          |
+----+-----------------+----------------------+-------+---------+------+------------------------+-------------------------------------------+
3 rows in set (0.00 sec)

3)查找MySQL内部线程对应的系统线程ID

从MySQL 5.7开始,performance_schema.threads 表增加 THREAD_OS_ID 列,用于记录MySQL内部线程对应的系统线程ID。

mysql> select * from performance_schema.threads where processlist_id=10\G
*************************** 1. row ***************************
          THREAD_ID: 49
               NAME: thread/sql/one_connection
               TYPE: FOREGROUND
     PROCESSLIST_ID: 10
   PROCESSLIST_USER: root
   PROCESSLIST_HOST: tango-GDB-DB01
     PROCESSLIST_DB: tango
PROCESSLIST_COMMAND: Query
   PROCESSLIST_TIME: 84
  PROCESSLIST_STATE: User sleep
   PROCESSLIST_INFO: select count(1),sleep(2000) from tango.t2 for update
   PARENT_THREAD_ID: NULL
               ROLE: NULL
       INSTRUMENTED: YES
            HISTORY: YES
    CONNECTION_TYPE: SSL/TLS
       THREAD_OS_ID: 1657
     RESOURCE_GROUP: USR_default
1 row in set (0.00 sec)

以上找到MySQL内部的thread_id和对应操作系统的线程ID:THREAD_OS_ID

4)找到对应的操作系统线程信息

[root@tango-GDB-DB01 ~]# top -H -p 1479
top - 17:41:22 up 41 min,  3 users,  load average: 0.00, 0.01, 0.05
Threads:  39 total,   0 running,  39 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  1.5 sy,  0.0 ni, 98.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1867024 total,   483128 free,   513864 used,   870032 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1158844 avail Mem 
   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                             
  1657 mysql     20   0 1318236 377188  16536 S  0.0 20.2   0:00.04 mysqld

通过top -H可以看到对应线程的CPU使用情况,包括内存和CPU的使用

2.2 查询当前statements和历史statements

1)查询当前statements表

mysql> select * from performance_schema.events_statements_current WHERE THREAD_ID = 49\G
*************************** 1. row ***************************
              THREAD_ID: 49
               EVENT_ID: 20
           END_EVENT_ID: NULL
             EVENT_NAME: statement/sql/select
                 SOURCE: init_net_server_extension.cc:96
            TIMER_START: 10615744184481000
              TIMER_END: 10743215769959000
             TIMER_WAIT: 127471585478000
              LOCK_TIME: 121000000
               SQL_TEXT: select count(1),sleep(2000) from tango.t2 for update
                 DIGEST: 91558228446c9877c86805735096b85b8afe5a8148c4ea9c315a1948464ab27f
            DIGEST_TEXT: SELECT COUNT (?) , `sleep` (?) FROM `tango` . `t2` FOR UPDATE
         CURRENT_SCHEMA: tango
            OBJECT_TYPE: NULL
          OBJECT_SCHEMA: NULL
            OBJECT_NAME: NULL
  OBJECT_INSTANCE_BEGIN: NULL
            MYSQL_ERRNO: 0
      RETURNED_SQLSTATE: NULL
           MESSAGE_TEXT: NULL
                 ERRORS: 0
               WARNINGS: 0
          ROWS_AFFECTED: 0
              ROWS_SENT: 0
          ROWS_EXAMINED: 0
CREATED_TMP_DISK_TABLES: 0
     CREATED_TMP_TABLES: 0
       SELECT_FULL_JOIN: 0
 SELECT_FULL_RANGE_JOIN: 0
           SELECT_RANGE: 0
     SELECT_RANGE_CHECK: 0
            SELECT_SCAN: 1
      SORT_MERGE_PASSES: 0
             SORT_RANGE: 0
              SORT_ROWS: 0
              SORT_SCAN: 0
          NO_INDEX_USED: 1
     NO_GOOD_INDEX_USED: 0
       NESTING_EVENT_ID: 18
     NESTING_EVENT_TYPE: TRANSACTION
    NESTING_EVENT_LEVEL: 0
           STATEMENT_ID: 37
1 row in set (0.00 sec)

2)执行SHOW ENGINE INNODB STATUS\G查看事务状态:

---TRANSACTION 2715147, ACTIVE 480 sec
mysql tables in use 1, locked 1
2 lock struct(s), heap size 1136, 3 row lock(s)
MySQL thread id 10, OS thread handle 140127942276864, query id 37 tango-GDB-DB01 192.168.112.121 root User sleep
select count(1),sleep(2000) from tango.t2 for update
Trx read view will not see trx with id >= 2715147, sees < 2715147

MySQL连接ID=10,OS线程句柄 = 140127942276864

3)查看历史thread_statement信息

mysql> select * from performance_schema.events_statements_history  WHERE THREAD_ID = 49 limit 1 \G
*************************** 1. row ***************************
              THREAD_ID: 49
               EVENT_ID: 17
           END_EVENT_ID: 18
             EVENT_NAME: statement/sql/begin
                 SOURCE: init_net_server_extension.cc:96
            TIMER_START: 10288037810168000
              TIMER_END: 10288037917673000
             TIMER_WAIT: 107505000
              LOCK_TIME: 0
               SQL_TEXT: begin
                 DIGEST: 55fa5810fbb2760e86d578526176c1497b134d4ef3dd0863dd78b1c5e819848c
            DIGEST_TEXT: BEGIN
         CURRENT_SCHEMA: tango
            OBJECT_TYPE: NULL
          OBJECT_SCHEMA: NULL
            OBJECT_NAME: NULL
  OBJECT_INSTANCE_BEGIN: NULL
            MYSQL_ERRNO: 0
      RETURNED_SQLSTATE: 00000
           MESSAGE_TEXT: NULL
                 ERRORS: 0
               WARNINGS: 0
          ROWS_AFFECTED: 0
              ROWS_SENT: 0
          ROWS_EXAMINED: 0
CREATED_TMP_DISK_TABLES: 0
     CREATED_TMP_TABLES: 0
       SELECT_FULL_JOIN: 0
 SELECT_FULL_RANGE_JOIN: 0
           SELECT_RANGE: 0
     SELECT_RANGE_CHECK: 0
            SELECT_SCAN: 0
      SORT_MERGE_PASSES: 0
             SORT_RANGE: 0
              SORT_ROWS: 0
              SORT_SCAN: 0
          NO_INDEX_USED: 0
     NO_GOOD_INDEX_USED: 0
       NESTING_EVENT_ID: NULL
     NESTING_EVENT_TYPE: NULL
    NESTING_EVENT_LEVEL: 0
           STATEMENT_ID: 28
1 row in set (0.00 sec)
2.3 kill长时间运行或高CPU的thread

1)show processlists找到长时间运行的SQL

mysql> show processlist;
+----+-----------------+----------------------+-------+---------+-------+------------------------+------------------------------------------------------+
| Id | User            | Host                 | db    | Command | Time  | State                  | Info                                                 |
+----+-----------------+----------------------+-------+---------+-------+------------------------+------------------------------------------------------+
|  5 | event_scheduler | localhost            | NULL  | Daemon  | 11423 | Waiting on empty queue | NULL                                                 |
| 10 | root            | tango-GDB-DB01:50620 | tango | Query   |   816 | User sleep             | select count(1),sleep(2000) from tango.t2 for update |

2)通过TOP -H找到CPU高消耗的thread
在这里插入图片描述

反向查找到processlist id

mysql> select * from performance_schema.threads WHERE THREAD_OS_ID = 1657\G
*************************** 1. row ***************************
          THREAD_ID: 49
               NAME: thread/sql/one_connection
               TYPE: FOREGROUND
     PROCESSLIST_ID: 10
   PROCESSLIST_USER: root
   PROCESSLIST_HOST: tango-GDB-DB01
     PROCESSLIST_DB: tango
PROCESSLIST_COMMAND: Query
   PROCESSLIST_TIME: 1050
  PROCESSLIST_STATE: User sleep
   PROCESSLIST_INFO: select count(1),sleep(2000) from tango.t2 for update
   PARENT_THREAD_ID: NULL
               ROLE: NULL
       INSTRUMENTED: YES
            HISTORY: YES
    CONNECTION_TYPE: SSL/TLS
       THREAD_OS_ID: 1657
     RESOURCE_GROUP: USR_default
1 row in set (0.00 sec)

3)在mysql客户端kill processlist id

mysql> kill 10;
Query OK, 0 rows affected (0.00 sec)

杀掉当前长事务或者thread

3、OS thread handle和操作系统线程ID的对应关系

在2.2步骤中查到的OS thread handle 140127942276864(OS thread handle是进程内部用于识别各个线程的内部ID),这里是个十进制的数值,需要先转成十六进制:

mysql> select lower(conv(140127942276864, 10, 16));
+--------------------------------------+
| lower(conv(140127942276864, 10, 16)) |
+--------------------------------------+
| 7f721438f700                         |
+--------------------------------------+
1 row in set (0.00 sec)

2)利用 pstack 查询该句柄和操作系统线程ID的关联:

[root@tango-GDB-DB01 ~]# pstack 1479 |grep 7f721438f700
Thread 3 (Thread 0x7f721438f700 (LWP 1657)):

可以看到 LWP=1657,对应上面的THREAD_OS_ID值,LWP是Light-Weight Processes的缩写。


  1. https://blog.youkuaiyun.com/n88Lpo/article/details/121964562
  2. 数据库系列之InnoDB解密
比较数据迁移后MySQL数据库和openGauss数据仓库中的表 设计一个MySQL数据库和openGauss数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。 阅读详情

相关推荐

比较数据迁移后MySQL数据库和ClickHouse数据仓库中的表

设计一个MySQL数据库和Clickhouse数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较玩所有的数据。

weixin_30777913的博客 1363

mysql中thread_id,processlistid,os_id等详解

thread_id: 仅在perforamance_schema中使用,是其内部自动增长的计数器,前台和后台线程均有这个id,且thread_id和thread_os_id相关联。 processlistid: 一般在mysql层使用,跟前台登录会话相关联,是真正的线程ID。 processlistid和前台用户直接相关,每创建一个登录会话,就会新增一个processlistid。 ...

lifht的博客 4296

MySql唯一ID生成

前阵子,一直在折腾阿里云。写的一些文章也放到自己的wordpress博客上了。但自己前阵子在做系统更换操作的时候未备份磁盘,大部分心血付诸东流。真是一个悲伤的故事。现在决定用.NET搞搞自己的博客。正好把wordpress给抛弃掉。 言归正传,这个唯一号类似自增ID,自增id虽然好用,但进行数据库切换(SQL换Mysql等等)的时候,参与具体业务逻辑的这个东西说不定就是一个定时炸弹。但如

shenge321的专栏 1万+

PID (Process ID) 和 thread_id (Thread ID) 的区别

在一个进程中,每个线程的 thread_id 是唯一的,但不同的进程可以拥有相同 thread_id 的线程。: thread_id 是 Thread Identifier(线程标识符)的缩写,它是由操作系统为每个线程赋予的唯一数字标识。简而言之,PID 与 thread_id 分别代表操作系统中进程和线程的唯一身份,它们各自服务于进程管理和线程调度的不同层面。它在进程内部必须是唯一的,但在不同进程中可以重复,且线程结束时不会被同一进程内的其他线程复用。等)管理和跟踪进程。

日拱一卒,玉汝于成 2454

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。:实际部署时需根据具体硬件配置调整连接池大小和批次规模,建议在测试环境进行参数校准。

weixin_30777913的博客 1307

C++笔记之获取线程ID以及线程ID的用处

线程 ID 并不是直接用于线程同步的工具,而是用于标识不同的线程。在这种情况下,你可以使用线程 ID 来识别和区分不同的线程,并为它们分配不同的资源。线程同步是确保多线程程序安全运行的关键部分,使用线程 ID 和互斥锁可以帮助你实现正确的线程同步。这个示例使用线程 ID 辅助线程同步,但实际上线程同步可能涉及更复杂的逻辑和多个线程之间的交互,线程 ID 通常是用于确定特定线程的条件是否满足,从而执行或等待。在这个示例中,有四个线程执行任务,但奇数线程(线程1和线程3)被分配更多的计算资源。

小勇博客 2667

浅析:Java Thread ID是否重用

1. 问题来源 我最近在看Java多线程的视频时,主讲老师介绍Thread.getId()函数,后面演示的时候,说到,“thread ID可能会被重用”。他示范了几次,thread ID都是递增的,问题在当时没有解释清楚,所以我去查了一下源码,在此做一个简单总结。 2. getId()函数 首先API文档中对Thread.getId()的detail描述,说到当一个线程终止运行后,它的thread ID可能会被重用。但是,问题在于它是怎么被重用的? 然后,我去查了源码(下图是其中一部分,出自java/la

Theworldwillbegood的博客 2287

C++ std::thread::id实例:如何获得线程id

在这个示例中,我们创建一个名为“foo”的函数,并使用std::thread t(foo)来创建一个新的线程。我们然后使用std::this_thread::get_id()方法来获取当前线程的ID,并将其打印到控制台上。std::thread::id类提供了一种简单的、可移植的方式,可以在程序运行时检查一个线程是否等于另一个线程。总结一下,std::thread::id为我们提供了一种简单的方式来获取线程的唯一标识符。C++ std::thread::id实例:如何获得线程id。

CodeSpark的博客 2399

Mysql性能排查—结合操作系统线程 查看mysql中的sql资源消耗

当系统资源紧张时,可以通过系统的线程id 来查找对应mysql的sql语句。 以便快速定位问题。 --一、结合操作系统线程 查看mysql中的sql资源消耗 (5.7才可以, 5.7时performance_schema.threads表才加入的thread_os_id系统线程字段) --1、top -H 查看具体线程的CPU消耗 [root@h...

翔之天空的专栏 2600

群晖Hyper Backup还原实战:加密与非加密备份的完整操作指南

本文详细介绍了群晖Hyper Backup在加密与非加密备份场景下的完整还原操作指南。通过实战案例和高级技巧,帮助用户应对硬盘故障或系统崩溃时的数据恢复挑战,特别是加密备份恢复中的关键节点和常见陷阱。

weixin_29323365的博客 439

AI脸部替换Roop-Unleashed,一键整合包教程

Roop-Unleashed是一个无须训练模型的深度伪造工具,专为图像和视频的面部替换而设计。它通过简洁的浏览器界面提供用户友好且跨平台的使用体验,无论用户是业余爱好者还是专业人士,都能快速上手。它无需复杂的设置即可实现高效的处理和转换,使图像和视频的编辑变得更加轻松和便捷。

m0_72580657的博客 1万+

mysql kill id_如何 查找 mysql 中如何 kill 引起死锁的线程id

展开全部如果遇到死锁了,怎么解决呢?找到原始的锁ID,然后KILL掉一直持有的那个线程就可e69da5e887aa3231313335323631343130323136353331333337383965以了, 但是众多线程,可怎么找到引起死锁的线程ID呢? MySQL 发展到现在,已经非常强大了,这个问题很好解决。 直接从数据字典连查找。我们来演示下。线程A,我们用来锁定某些记录,假设这个线程...

weixin_32860759的博客 1678

Oracle EBS FA 如何打开关闭的资产会计期间?

用户“运行折旧”,误勾选为“关闭期间”,还有一部分资产还需要操作报废和调整,希望后台打开关闭的资产会计期。

陈显平的专栏-Oracle EBS 1027

MySQL的 performance_schema.threads 和操作系统的线程 ID

在和同事讨论 systemtap 的时候, 提到 performance_schema 里的 threads 表,只要 client 连接上 server之后,在该 session 里面执行的所有 SQL 都有共同的线程 ID: mysql> select processlist_id,thread_os_id from performance_schema.threads where processlist_info like 'select process%'; +----------------

cpxsxn的博客 1955

面试问题总结——关于OpenCV(一)

整理了一下网上和我面试中遇到的关于OpenCV相关的问题。 其中因为我的简历中有个项目用到了特征点检测相关的知识,所以整理了SIFT/SURF和FLANN。 有些知识点也不深入,对于写的不对的地方,欢迎指正。 关于OpenCV的内容 1.OpenCV中cv::Mat的深拷贝和浅拷贝问题   深拷贝:分配新内存的同时拷贝数据,当被赋值的容器被修改时,原始容器数据不会改变。   浅拷贝:仅拷贝数据,当被赋值容器修改时,原始容器数据也会做同样改变。 OpenCV的Mat时,有几种赋值方式分别为:   深.

boss-dog 1万+

小黄鸭机器人技术全解-第 07 章 关节自由度与行程参数

—鸭子歪着头转头时,转的平面是斜的,这正是它"灵动"感的来源。仿真里这是自动的(轴定义在父刚体系),复刻时不需要做任何事——

yolo模型训练找我,AI游戏合作找我 61

mysql id 和线程_查找MySQL线程中死锁的ID的方法

如果遇到死锁了,怎么解决呢?找到原始的锁ID,然后KILL掉一直持有的那个线程就可以了, 但是众多线程,可怎么找到引起死锁的线程ID呢? MySQL 发展到现在,已经非常强大了,这个问题很好解决。 直接从数据字典连查找。我们来演示下。线程A,我们用来锁定某些记录,假设这个线程一直没提交,或者忘掉提交了。 那么就一直存在,但是数据里面显示的只是SLEEP状态。mysql> set @@auto...

weixin_39641231的博客 166

SAP PCE 到底有没有 AI 能力:从标准功能、Joule、ABAP 扩展到项目落地的完整解读

摘要:SAP S/4HANA Cloud Private Edition(PCE)已深度集成AI能力,主要体现在三个方面:1)标准业务流程中的AI辅助功能(如财务分录生成、维修单据处理);2)通过Joule提供的自然语言交互入口,支持业务导航和部分事务处理;3)开发者可通过ABAP AI SDK与BTP平台集成实现扩展。PCE不是独立AI平台,企业级自定义AI需结合SAP BTP实现。AI能力已深度融入财务、制造等业务场景,但关键业务仍需人工审核。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 330

如何在MySQL中查询OS线程id(LWP)?

如何在MySQL中查询OS线程id(LWP)? [root@LHRDB ~]# ps -Lf 16833 UID PID PPID LWP C...

小麦苗DBA宝典 748

基于生存结局(生存分析/COX回归)的中介效应分析

① 建立观察变量OVB和中介变量MVB的回归模型(注意:这里根据mediation包的介绍,需要构建的是probit模型,而不是logist回归模型,网上有很多的代码用的logistic回归,结果自己跑的时候发现报错,我在这里陷了很久;为了方便演示,我们生成了一个协变量(Age)、一个连续型观察变量(liaOVC)、一个二分类观察变量(OVB)、一个连续型中介变量(MVC)、一个二分类中介变量(MVB)以及最后的结局变量(生存时间[time],生存结局[stats])。

m0_61863309的博客 1万+

Python爬虫教程:抓取短视频平台数据(以抖音和快手为例)

为什么抓取短视频平台数据?内容分析:通过抓取短视频平台上的视频内容、标题、标签等数据,可以进行内容分类、趋势分析、话题分析等。情感分析:抓取视频的评论数据,并进行情感分析,帮助企业或组织了解公众的情绪反馈。用户行为分析市场监测:通过抓取特定关键词或标签下的视频数据,分析市场趋势,进行竞争对手分析。短视频平台数据类型:视频信息:包括视频标题、描述、标签、作者等。用户信息:包括用户的昵称、粉丝数、关注数等。互动数据评论数据:视频下的用户评论内容及用户信息。

2201_76125261的博客 3659

mysql 实现id自增序列_mysql自增id列怎么设置?

展开全部create table cdat(localt char(20) not null,cd char(5) not null,snosat char(2) not null,rnorec char(3) not null,id INT(20) not null AUTO_INCREMENT,primary key (id));MySQL是一个开放源码的小型关联式数据库管理系统,开32313...

weixin_39901518的博客 2513

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

mysql id 和线程_MySQL:简单记录performance_schema.threads中的3种线程ID各自的含义

简单记录如下线面3种ID到底什么意思,这个问题我一直没去看:(root@localhost)[05:47:31] [performance_schema ;]> select THREAD_ID,PROCESSLIST_ID,THREAD_OS_ID from performance_schema.threads ;+-----------+----------------+------...

weixin_42306501的博客 494

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

QT在多线程中正确使用数据库MySQL

问题: 很多QT新手多线程使用数据库时,经常遇到警告: QSqlDatabasePrivate::database: requested database does not belong to the calling thread. 究其原因,帮助助手明确说明 Threads and the SQL Module A connection can only be used from within the thread that created it. Moving connections bet

jdljldsflj的专栏 5551

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Mysql全局ID生成方法

生产系统随着业务增长总会经历一个业务量由小变大的过程,可扩展性是考量数据库系统高可用性的一个重要指标;在单表/数据库数据量过大,更新量不断飙涨时,MySQL DBA往往会对业务系统提出sharding的方案。

unber的博客 1698

mysql 线程id_查找MySQL线程中死锁的ID的方法

如果遇到死锁了,怎么解决呢?找到原始的锁ID,然后KILL掉一直持有的那个线程就可以了, 但是众多线程,可怎么找到引起死锁的线程ID呢? MySQL 发展到现在,已经非常强大了,这个问题很好解决。 直接从数据字典连查找。我们来演示下。线程A,我们用来锁定某些记录,假设这个线程一直没提交,或者忘掉提交了。 那么就一直存在,但是数据里面显示的只是SLEEP状态。mysql> set @@auto...

weixin_39883286的博客 861
上一篇: ChatGPT发展机遇和思考
下一篇: 类ChatGPT模型ChatGLM-b6本地部署实践
solihawk
博客等级 码龄17年 7995粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值