OceanBase 4.3.5 解析:DDL性能诊断

背景

DDL操作通常耗时较长,特别是涉及补数据流程的DDL语句。在执行过程中,用户面临两个主要痛点:一是无法实时获取DDL执行进度,难以区分长时间运行是正常现象还是由内部异常导致的停滞;二是执行效率经常低于预期,而传统的问题诊断需要跨越多张系统表和视图,操作流程复杂。为此,OceanBase 的新版本通过提供可查询的系统视图来简化DDL性能问题排查。

使用说明

SESSION_LONGOPS视图输出行为变更

变更了 SESSION_LONGOPS视图中 DDL 处于REDEFINITION阶段时 message列的输出逻辑 。其他保持和原有的一致。

DDL 处于REDEFINITION阶段即通过发生innsql完成补数据流程图。通过sql的算子实现。整个过程主要分为 scan,sort, insert三个阶段。在以前版本的行为中,无论具体执行到了哪一个阶段,都会返回这三个阶段处理的行数。如下所示


// 不使用column group
+----------------------------------------------------------------------------------------------------------------------------+
|                                                                                            MESSAGE                         |
+----------------------------------------------------------------------------------------------------------------------------+
| TENANT_ID: %d, TASK_ID: %d, STATUS: REPLICA BUILD, PARALLELISM: %ld, ROW_SCANNED: %ld, ROW_SORTED: %ld, ROW_INSERTED: %ld  |
+----------------------------------------------------------------------------------------------------------------------------+// 使用 column group
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                                                            MESSAGE                                                                                      |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TENANT_ID: %d, TASK_ID: %d,  STATUS: REPLICA BUILD, PARALLELISM: %ld, ROW_SCANNED: %ld, ROW_SORTED: %ld, ROW_INSERTED_INTO_TMP_FILE: %ld, ROW_INSERTED: %ld out of %ld column group rows|
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

状态定义

在新的方案中,我们统计了更加详细的信息,但是一次展示过于复杂。因此分阶段展示信息。考虑到多线程场景,不同线程执行速度可能不一致,因此考虑展示最慢线程所处阶段的信息。阶段定义如下。同时,无论处于哪个阶段,还是会输出总扫描行数,总排序行数,总插入行数这些整体信息。

enum class RedefinitionState
{BEFORESCAN = 0,SCAN,SORT-PHASE1,SORT-PHASE2,INSERT
};

排序阶段分为 内存排序和外部排序,两个需要分别展示,但是为了方便用户理解,不暴露实现细节,使用 SORT-PHASE1 和 SORT-PHASE2 分别代表两个阶段。

BEFORESCAN

扫描开始前的阶段,可能位于采样等环节。

"TENANT_ID: %d, TASK_ID:%d STATUS: REPLICA BUILD, BEFORE-SCAN"
SCAN

扫描阶段。因为还无法获取总行数,所以扫描进度和预计用时无法计算,只能输出已经扫描的总行数。 同时还会输出扫描的并行度和 扫描已经花费的时间,另外还会输出所有线程中扫描最多和最少的行数

TENANT_ID: %d, TASK_ID:%d STATUS: REPLICA BUILD, SCANNING, PARALLELISM: %ld,
ROW_ROUNT_INFO:{ ROW_SCANNED: %ld, ROW_SORTED: %ld, ROW_INSERTED: %ld },
SCAN_INFO:{ SCAN_TIME_ELAPSED: %.3fs, MAX_THREAD_ROW_SCANNED: %ld, MIN_THREAD_ROW_SCANNED: %ld }

示例

TENANT_ID: 1004, TASK_ID: 1000817, STATUS: REPLICA BUILD, SCANNING, PARALLELISM: 2,
ROW_COUNT_INFO:{ ROW_SCANNED: 30798887, ROW_SORTED: 0, ROW_INSERTED: 0 },
SCAN_INFO:{ SCAN_TIME_ELAPSED: 86.529s, MAX_THREAD_ROW_SCANNED: 15428902, MIN_THREAD_ROW_SCANNED: 15369985 }第一行是整个ddl_task的整体信息,执行的租户id为1004,task_id为 1000817,处于扫描阶段,扫描并行度为2第二行是扫描行数,总排序行数,总插入行数信息。第三行是为扫描阶段具体信息,当前扫描已花费时间为 86.529s ,最多的线程扫了 15428902 行, 最少的线程扫了 15369985 行
SORT-PHASE1

内存排序阶段。从此阶段开始,不同线程之间进度独立。输出的阶段和进度按照最慢统计。 为了不产生误导PARALLELISM仍然展示所有的工作线程数(inmem_sort+merge_sort+insert),另外单独输出位于该阶段的线程数。

输出格式为

TENANT_ID: 1, TASK_ID: 3051020, STATUS: REPLICA BUILD, SORT_PHASE1, PARALLELISM: %ld, SORT_PHASE1_THREAD_NUM: %ld,
ROW_COUNT_INFO:{ ROW_SCANNED: %ld, ROW_SORTED: %ld, ROW_INSERTED: %ld },
SORT_PHASE1_PROGRESS_INFO:{ SORT_PHASE1_TIME_ELAPSED: %.3fs, SORT_PHASE1_PROGRESS: %.2f%%, SORT_PHASE1_TIME_REMAINING: %.3fs },
SLOWEST_THREAD_INFO:{ THREAD_ID: %ld, SORTED_ROW_COUNT: %ld }

示例

TENANT_ID: 1004, TASK_ID: 1000817, STATUS: REPLICA BUILD, SORT_PHASE1, PARALLELISM: 2, SORT_PHASE1_THREAD_NUM: 2,
ROW_COUNT_INFO:{ ROW_SCANNED: 32000000, ROW_SORTED: 30917952, ROW_INSERTED: 0 },
SORT_PHASE1_PROGRESS_INFO:{ SORT_PHASE1_TIME_ELAPSED: 137.501s, SORT_PHASE1_PROGRESS: 96.56%, SORT_PHASE1_TIME_REMAINING: 4.892s },
SLOWEST_THREAD_INFO:{ THREAD_ID: 2807314, SORTED_ROW_COUNT: 15458976 }第一行是整个ddl_task的整体信息,执行的租户id为1004,task_id为 1000817, 
当前阶段为REPLICA BUILD的INMEM_SORT阶段。当前并行度为2第二行总扫描行数,总排序行数,总插入行数信息的整体信息,第三行为阶段的时间和进度信息,当前阶段已进行137.501s, 当前阶段进度为96.56%,预计还需要4.892s完成。第四行是最慢线程信息, 最慢线程的线程id为 2807314, 最慢线程处理了 15458976 行,
SORT-PHASE2

外部排序阶段,前面和内存排序一样, 但是因为涉及到落盘操作,会额外输出 落盘io量和临时文件压缩类型等信息

TENANT_ID: 1004, TASK_ID: 1000817, STATUS: REPLICA BUILD, SORT_PHASE2, PARALLELISM: %ld, SORT_PHASE2_THREAD_NUM: %ld,
ROW_COUNT_INFO:{ ROW_SCANNED: %ld, ROW_SORTED: %ld, ROW_INSERTED: %ld },
SORT_PHASE2_PROGRESS_INFO:{ SORT_PHASE2_TIME_ELAPSED: %.3fs, SORT_PHASE2_PROGRESS: %.2f%%, SORT_PHASE2_TIME_REMAINING: %.3fs },
SLOWEST_THREAD_INFO:{ THREAD_ID: %ld, SORTRD_ROW_COUNT: %ld },
TEMP_FILE_INFO:{ DUMP_SIZE: %ld, COMPRESS_TYPE: %s }

示例

TENANT_ID: 1004, TASK_ID: 1000817, STATUS: REPLICA BUILD, SORT_PHASE2, PARALLELISM: 2, SORT_PHASE2_THREAD_NUM: 1,
ROW_COUNT_INFO:{ ROW_SCANNED: 32000000, ROW_SORTED: 121040340, ROW_INSERTED: 44300 },
SORT_PHASE2_PROGRESS_INFO:{ SORT_PHASE2_TIME_ELAPSED: 35.277s, SORT_PHASE2_PROGRESS: 85.49%, SORT_PHASE2_TIME_REMAINING: 5.986s },
SLOWEST_THREAD_INFO:{ THREAD_ID: 2807315, SORTRD_ROW_COUNT: 41013268 },
TEMP_FILE_INFO:{ DUMP_SIZE: 366975583, COMPRESS_TYPE: zstd_1.3.8 }第一行是整个ddl_task的整体信息,执行的租户id为1004 ,task_id为 1000817, 
当前阶段为REPLICA BUILD的SORT-PHASE2阶段。当前并行度为2,但是只有一个线程处于排序第二阶段,说明其完成排序进入插入阶段。第二行是总扫描行数,总排序行数,总插入行数信息。第三行是当前阶段时间和进度信息。当前阶段已进行35.277s,当前阶段进度为85.49%,预计剩余5.986s完成。第四行是最慢线程信息,最慢线程的线程id为 2807315, 处理了 41013268行第五行是临时文件存储有关信息,当前总落盘量为 366975583, 临时文件采用的压缩算法为 zstd_1.3.8 
insert

插入阶段,对于column group > 1的表,与原版本保持一致。对于column group为1的表,新行为和sort相似

TENANT_ID: 1004, TASK_ID: 1000817, STATUS: REPLICA BUILD, INSERT, PARALLELISM: %ld, INSERT_THREAD: %ld,
ROW_COUNT_INFO:{ ROW_SCANNED: %ld, ROW_SORTED: %ld, ROW_INSERTED: %ld },
INSERT_PROGRESS_INFO:{ INSERT_TIME_ELAPSED: %.3fs, INSERT_PROGRESS: %.2f%%, INSERT_TIME_REMAINING: %.3fs },
SLOWEST_THREAD_INFO:{ THREAD_ID: %ld, INSERTED_ROW_COUNT: %ld }

示例

TENANT_ID: 1004, TASK_ID: 1000817, STATUS: REPLICA BUILD, INSERT, PARALLELISM: 2, INSERT_THREAD: 2,
ROW_COUNT_INFO:{ ROW_SCANNED: 32000000, ROW_SORTED: 128000000, ROW_INSERTED: 28806480 },
INSERT_PROGRESS_INFO:{ INSERT_TIME_ELAPSED: 121.941s, INSERT_PROGRESS: 86.61%, INSERT_TIME_REMAINING: 18.845s },
SLOWEST_THREAD_INFO:{ THREAD_ID: 2807315, INSERTED_ROW_COUNT: 13850544 }第一行是整体信息, 租户ID 1004, task_id 1000817,当前阶段为REPLICA BUILD的insert阶段。当前并行度为2第二行是总扫描行数,总排序行数,总插入行数信息。第三行是当前阶段时间和进度信息。当前阶段已进行121.941s,插入进度为57.87%,预计 还有16.725s能完成插入阶段。第四行是最慢线程信息。最慢线程的线程id为2236847, 处理了3188860行
局部索引的特殊处理

局部索引是存在优化,可能会串行分批发送inner_sql。在这种情况下,为了不产生混淆。针对局部索引。会在输出tenant_id后task_id后添加build local index batch num: %ld的信息。

//示例
TENANT_ID: 1, TASK_ID: 3051020, build local index batch num: 2, STATUS: REPLICA BUILD, SORT_PHASE2, PARALLELISM: %ld, SORT_PHASE2_THREAD_NUM: %ld,
ROW_COUNT_INFO:{ROW_SCANNED: %ld, ROW_SORTED: %ld, ROW_INSERTED: %ld }, 
SORT_PHASE2_PROGRESS_INFO:{ SORT_PHASE2_TIME_ELAPSED: %.3fs, SORT_PHASE2_PROGRESS: %.2f%%, SORT_PHASE2_TIME_REMAINING: %.3fs }, 
SLOWEST_THREAD_INFO:{ THREAD_ID: %ld, SORTRD_ROW_COUNT: %ld }, 
TEMP_FILE_INFO:{ DUMP_SIZE: %ld, COMPRESS_TYPE: %s }build local index batch num: 2 表示目前是局部索引的第二批执行。其他语义不变。

新增 __all_virtual_ddl_diagnose_info 虚拟表

各字段说明

FieldTypeNullKeyDefaultExtra
tenant_idbigint(20)NOPK租户ID
ddl_task_idbigint(20)NOPK任务ID
object_table_idbigint(20)NOPK目标表ID
op_typevarchar(64)NOPKDDL操作类型
create_timetimestampNOPKDDL开始时间
finish_timetimestampNULLDDL结束时间
diagnose_infovarchar(1024)NULLDDL执行诊断信息

目前虚拟表会输出正在进行的DDL和最近完成的100条DDL的信息。因为只能对走sql 路径的DDL进行诊断。类型如下

DDL_CREATE_INDEX
DDL_CREATE_PARTITIONED_LOCAL_INDEX 
DDL_MODIFY_COLUMN
DDL_ADD_PRIMARY_KEY
DDL_ALTER_PRIMARY_KEY
DDL_ALTER_PARTITION_BY
DDL_TABLE_REDEFINITION

诊断信息输出

还未开始扫描的DDL

对于正在进行的DDL, 在扫描开始前无统计信息,此时message为空。

+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+---------------+
| tenant_id | ddl_task_id | object_table_id | opname                             | create_time                | finish_time                | diagnose_info |
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+---------------+
|      1004 |     2079489 |          500005 | DDL_CREATE_PARTITIONED_LOCAL_INDEX | 2024-12-30 19:21:13.619570 | 2024-12-30 19:21:14.297205 |               |
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+---------------+
还未开始排序的DDL

在扫描阶段无法感知异常信息。在这个阶段因此仅输出 “Scanning” 信息。

+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+---------------+
| tenant_id | ddl_task_id | object_table_id | opname                             | create_time                | finish_time                | diagnose_info |
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+---------------+
|      1004 |     2079489 |          500005 | DDL_CREATE_PARTITIONED_LOCAL_INDEX | 2024-12-30 19:21:13.619570 | 2024-12-30 19:21:16.706037 | Scanning      |
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+---------------+
空算子DDL

没有找到对应的sql_monitor_node或者算子总行数为0的情况。此时不进行诊断。不会出现在虚拟表中。

开始排序的DDL

THREAD_INFO: { parallel_num : %ld, row_max: %ld, row_max_thread_id: %ld, row_min: %ld, row_min_thread_id: %ld }

展示并行度,还有行数最多和最少的线程信息。

+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------+
| tenant_id | ddl_task_id | object_table_id | opname                             | create_time                | finish_time                | diagnose_info                                                                                                                 |
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------+
|      1004 |     2079489 |          500005 | DDL_CREATE_PARTITIONED_LOCAL_INDEX | 2024-12-30 15:35:37.995584 | 2024-12-30 19:21:16.706037 | THREAD_INFO: { parallel_num : 5, row_max: 6512288, row_max_thread_id: 3025919, row_min: 6243328, row_min_thread_id: 3025940 } |
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------+
执行完成的DDL

对于已经执行成功的DDL, 会输出以下信息

THREAD_INFO: { parallel_num : %ld, row_max: %ld, row_max_thread_id: %ld, row_min: %ld, row_min_thread_id: %ld slowest_thread_id: %ld }, 
TIME_INFO: { scan_time: %.3fs, sort_time: %.3fs, insert_time: %.3fs }
除了 并行度, 还有行数最多和最少的线程信息,另外还有执行最慢的线程id。
另外,还统计了各个阶段花费的时间信息。
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tenant_id | ddl_task_id | object_table_id | opname                             | create_time                | finish_time                | diagnose_info                                                                                                                                                                                                                         |
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|      1004 |     2069349 |          500907 | DDL_CREATE_PARTITIONED_LOCAL_INDEX | 2024-12-30 19:16:28.035185 | 2024-12-30 19:19:39.831287 | THREAD_INFO: { parallel_num : 5, row_max: 6512288, row_max_thread_id: 3025937, row_min: 6243328, row_min_thread_id: 3025940 slowest_thread_id: 3025936 }, TIME_INFO: { scan_time: 50.350s, sort_time: 70.715s, insert_time: 61.291s } |
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
发生过重试的DDL

发生重试的DDL ,会在最前面输出尝试次数信息

正在进行的DDL输出 当前次数,已经完成的DDL输出最高次数

+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tenant_id | ddl_task_id | object_table_id | opname                             | create_time                | finish_time                | diagnose_info                                                                                                                                                                                                                                       |
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|      1004 |     2069349 |          500907 | DDL_CREATE_PARTITIONED_LOCAL_INDEX | 2024-12-30 19:16:28.035185 | 2024-12-30 19:19:39.831287 | try count: 2, THREAD_INFO: { parallel_num : 5, row_max: 6512288, row_max_thread_id: 3025937, row_min: 6243328, row_min_thread_id: 3025940 slowest_thread_id: 3025936 }, TIME_INFO: { scan_time: 50.350s, sort_time: 70.715s, insert_time: 61.291s } |
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

异常诊断信息输出

分析诊断结果,如果存在异常场景,会输出诊断提醒。

数据倾斜:

当行数最多的线程和最低的线程相差大于 100%时,会认为存在数据倾斜,会在上面诊断信息的基础上添加以下信息。

The data skew is significant, with a low sampling rate or uneven sampling.
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tenant_id | ddl_task_id | object_table_id | opname                             | create_time                | finish_time                | diagnose_info                                                                                                                                                                                                                                                                                                                       |
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|      1004 |     4000296 |          501821 | DDL_CREATE_PARTITIONED_LOCAL_INDEX | 2024-12-31 09:47:39.521994 | 2024-12-31 09:50:25.560664 | THREAD_INFO: { parallel_num : 5, row_max: 6512288, row_max_thread_id: 3913304, row_min: 6243328, row_min_thread_id: 3913307 slowest_thread_id: 3913304 }, TIME_INFO: { scan_time: 26.608s, sort_time: 68.728s, insert_time: 60.114s }, DIAGNOSE_CASE: { The data skew is significant, with a low sampling rate or uneven sampling. }|
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
并行度低于预期

当实际处理数据的的算子数低于并行度时,会输出以下信息

The number of threads with data is less than the dop. real_parallelism: %ld
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tenant_id | ddl_task_id | object_table_id | opname                             | create_time                | finish_time                | diagnose_info                                                                                                                                                                                                                                                                                                        |
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|      1004 |     3046793 |          501563 | DDL_CREATE_INDEX                   | 2024-12-30 20:59:49.831452 | 2024-12-30 20:59:50.755917 | THREAD_INFO: { parallel_num : 5, row_max: 1, row_max_thread_id: 3150398, row_min: 1, row_min_thread_id: 3150398 slowest_thread_id: 3150399 }, TIME_INFO: { scan_time: 0.030s, sort_time: 0.002s, insert_time: 0.051s }, DIAGNOSE_CASE: { The number of threads with data is less than the dop. real_parallelism: 4. }|
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

局部索引的特殊处理

对于局部索引分批执行的场景。不输出各阶段的执行时间,同时也不进行数据倾斜度的计算。只诊断并行度低于预期的场景。同时会输出批次信息。正在进行的DDL输出当前处理的批次, 完成的DDL输出总批次。

+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tenant_id | ddl_task_id | object_table_id | opname                             | create_time                | finish_time                | diagnose_info                                                                                                                                                 |
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
|      1004 |     2079489 |          500005 | DDL_CREATE_PARTITIONED_LOCAL_INDEX | 2024-12-30 15:35:37.995584 | 2024-12-30 19:21:16.706037 | build local index batch num: 3, THREAD_INFO: { parallel_num : 5, row_max: 6512288, row_max_thread_id: 3025919, row_min: 6243328, row_min_thread_id: 3025940 } |
+-----------+-------------+-----------------+------------------------------------+----------------------------+----------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93014.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

幸福网咖订座点餐小程序的设计与实现

文章目录前言详细视频演示具体实现截图后端框架SpringBoot微信小程序持久层框架MyBaits成功系统案例:参考代码数据库源码获取前言 博主介绍:CSDN特邀作者、985高校计算机专业毕业、现任某互联网大厂高级全栈开发工程师、Gitee/掘金/华为云/阿里云/GitHub等平台持续…

C语言————练习题册(答案版)

目录 每日更新5-10题,感兴趣可以订阅 一.理解函数、操作符、占位符 1.1 欢迎来到C语言的世界 1.2 输入和输出 1.3 浮点数的打印 1.4 字符串的打印 1.14 I am iron man 1.5 求和运算 1.6 计算比例 1.7 求商求余 1.8 不同数位上的数字 1.8.1 求个位数 1.8…

haproxy配置详解

1、haproxy简介 HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的一个开源软件 是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器 支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计 企业版网站&#xff…

计网-TCP可靠传输

TCP(传输控制协议)的可靠传输是通过一系列机制保证数据准确、有序、不丢失地到达接收方。以下是TCP可靠传输的详细过程及核心机制:1. 数据分块与序列号(Seq)分块:应用层数据被分割成适合传输的TCP报文段&am…

数智管理学(三十九)

第三章 数智化对管理理论的冲击第三节 系统理论与生态化管理的强化系统理论作为理解企业运作与环境互动的重要框架,一直强调企业是一个由多个相互关联子系统构成的整体,其核心要素包括整体性、开放性、动态性和反馈机制。在传统管理视角下,这…

哈希表(c语言)

文章目录哈希表哈希表知识点哈希表概念负载因子哈希表的优缺点哈希冲突哈希函数常见哈希函数处理哈希冲突开放定址法线性探测二次探测链地址法哈希表的实现哈希表的核心:HashMap核心函数:从创建到销毁创建哈希表:hashmap_create()销毁哈希表:hashmap_des…

【Canvas与旗帜】条纹版大明三辰旗

【成图】【代码】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>十三条纹版大明三辰旗 Draft1</title><style type"text/…

【Java】空指针(NullPointerException)异常深度攻坚:从底层原理到架构级防御,老司机的实战经验

写Java代码这些年&#xff0c;空指针异常&#xff08;NullPointerException&#xff09;就像甩不掉的影子。线上排查问题时&#xff0c;十次有八次最后定位到的都是某个对象没处理好null值。但多数人解决问题只停留在加个if (obj ! null)的层面&#xff0c;没从根本上想过为什么…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 主页-评论用户时间占比环形饼状图实现

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解主页-评论用户时间占比环形饼状图实现 视频…

Redis面试精讲 Day 5:Redis内存管理与过期策略

【Redis面试精讲 Day 5】Redis内存管理与过期策略 开篇 欢迎来到"Redis面试精讲"系列的第5天&#xff01;今天我们将深入探讨Redis内存管理与过期策略&#xff0c;这是面试中经常被问及的核心知识点。对于后端工程师而言&#xff0c;理解Redis如何高效管理内存、处…

ICMPv6报文类型详解表

一、错误报文类型&#xff08;Type 1-127&#xff09;Type值名称Code范围触发条件示例典型用途1Destination Unreachable0-60: 无路由到目标1: 通信被管理员禁止2: 地址不可达3: 端口不可达4: 分片需要但DF标志设置5: 源路由失败6: 目的地址不可达网络故障诊断2Packet Too Big0…

配置nodejs

第一步确认 node.exe 和 npm 存在 例如安装目录D:\nodejs检查是否存在以下文件&#xff1a; node.exenpm.cmdnpx.cmd 第二步&#xff1a;添加环境变量 PATH 图形化操作步骤&#xff08;Windows&#xff09;&#xff1a; 右键「此电脑」→「属性」点击左侧 「高级系统设置」弹出…

MySQL的命令行客户端

MySQL中的一些程序&#xff1a;MySQL在安装完成的时候&#xff0c;一般都会包含如下程序&#xff1a;在Linux系统下&#xff0c;通过/usr/bin目录下&#xff0c;可以通过命令查看&#xff1a;以下是常用的MySQL程序&#xff1a;程序名作用mysqldMySQL的守护进程即MySQL服务器&a…

C# 值类型与引用类型的储存方式_堆栈_

目录 值类型 引用类型 修改stu3的值 stu也被修改了 为什么? &#xff08;对象之间&#xff09; 值类型中&#xff0c;值全在栈中单独存储&#xff0c;变量之间不会影响 结构体中&#xff0c;结构体全在栈中&#xff0c;结构体与结构体之间也不会相互影响 静态资源区 值类…

解锁永久会员的白噪音软件:睡眠助手

如今的年轻人压力普遍较大&#xff0c;学会解压至关重要。这期就为大家推荐一款优秀的白噪音软件&#xff0c;在压力大时听听&#xff0c;能起到不错的解压效果。 睡眠助手 文末获取 这款软件的特别版本十分出色&#xff0c;知晓的人不多。它已解锁永久会员&#xff0c;无需登…

uniapp使用css实现进度条带动画过渡效果

一、效果 二、实现原理 1.uni.createAnimation 动画函数 2.初始化uni.createAnimation方法 3.监听值的变化调用动画执行方法 三、代码 1.实现方式比较简单&#xff0c;目前是vue3的写法&#xff0c;vue2只需要稍微改动即可 <template><view class"layout_progre…

高级分布式系统调试:调试的科学与 USE 方法实战

高级分布式系统调试:调试的科学与 USE 方法实战 前言:从“救火”到“探案” 当一个复杂的分布式系统出现“灰色故障”——例如“服务有时会变慢”、“偶尔出现超时错误”——我们该从何处着手?随机地查看 Grafana 仪表盘,或者漫无目的地 tail -f 日志,往往效率低下,甚至…

栈算法之【有效括号】

目录 LeetCode-20题 LeetCode-20题 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每…

大模型——Data Agent:超越 BI 与 AI 的边界

Data Agent:超越 BI 与 AI 的边界 1. 数据工具的演进路径 在数据分析领域,技术工具经历了多个阶段的演进。这些演进不仅反映了技术的进步,也体现了用户需求和使用场景的变化。 Excel 时代:告别手工作业,陷入“表格泥潭“,早期数据分析依赖 Excel,实现基础数据记录、计…

数据空间技术在智慧水库管理平台中的赋能

数据空间技术在智慧水库管理平台中的赋能&#xff1a;设备到应用的数据传输优化 数据空间技术为智慧水库管理平台提供了革命性的数据传输、处理和安全保障能力。以下是数据空间技术在设备到应用数据传输过程中的全面赋能方案&#xff1a; 数据空间赋能架构设计 #mermaid-svg-R2…