南大通用数据库-Gbase-8a-学习-43-SQL长时间处于Writing to net状态排查

本文主要是介绍南大通用数据库-Gbase-8a-学习-43-SQL长时间处于Writing to net状态排查,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、问题截图

二、排查思路

1、Gbase8a SQL有几种状态

2、问题导致原因猜想

3、观察服务端(集群端)网络情况

4、观察客户端网络情况

5、排查客户端程序处理数据慢

5.1、send

(1)声明 

(2)作用

(3)参数

(4)返回值

(5)阻塞条件

5.2、recv

(1)声明 

(2)作用

(3)参数

(4)返回值

(5)阻塞条件

5.3、优化思路

6、查看计算节点

7、gccli执行SQL

8、调整参数max_allowed_packet


一、问题截图

今天我发现一个有趣的现象,用户执行一条长达17287秒(差不多5小时)的SQL,这个SQL并没有特别复杂,我用红箭头指出了特殊点:

1、SQL处于Writing to net状态。(这个状态持续了4个多小时)

2、查询的是INFORMATION_SCHEMA.COLUMNS系统表。

3、没有加过滤条件。

二、排查思路

1、Gbase8a SQL有几种状态

状态含义
init表示SQL进入准备执行阶段,开始执行计划。
deleting from main table/updating main table准备对主表进行删除或更新操作。
end/query endSQLSQL到达结束状态,准备清理资源。
Creating tmp table查询过程中,正在创建临时表。
Sending data读取数据向发起段发送查询结果。
closing tables关闭打开的表。
Evaluating执行计划评估。
Executing by step执行计划中的每一步。
Preparing metadata取得本查询所涉及表的可用节点信息。
Sending task to gnodes发送任务给数据节点。
Clear tmp tables查询完成,开始清理临时表。
Writing to Net向客户端发送数据包。
checking permissions检查权限。
commit提交数据。
killed被杀死。
logging slow query审计日志在保存慢SQL信息。
Rolling back数据回滚。

2、问题导致原因猜想

我们看到了Writing to Net的意思是向客户端发送数据包,会不会是网络的问题导致。我们可以提出一下几个猜想。

猜想是否为问题原因
服务端网络负载高未验证
客户端网络负载高未验证
客户端程序处理数据慢未验证

3、观察服务端(集群端)网络情况

Writing to Net的意思是向客户端发送数据包。会不会是网络负载较高,我这边是万兆网卡,理论可以达到10000Mbit/s,1Mbit(兆位) = 0.125Mb(兆字节),也就是1250Mb/s,nmon观察网络情况在33Mb/s上下浮动,排除是服务端网络问题。

猜想是否为问题原因
服务端网络负载高
客户端网络负载高未验证
客户端程序处理数据慢未验证

4、观察客户端网络情况

客户端服务器我这边没有权限,只能建议客户帮忙排查了,哈哈哈。

猜想是否为问题原因
服务端网络负载高
客户端网络负载高权限问题,建议客户帮忙验证。
客户端程序处理数据慢未验证

5、排查客户端程序处理数据慢

为什么我会有这样的想法呢,最近在学习网络编程相关的知识,会不会客户端程序处理逻辑有关,相关概念可以参考之前的博客《Unix环境高级编程-学习-05-TCP/IP协议与套接字》,服务端send数据,客户端recv数据,我们来简单介绍一下这两个函数,以及他们的阻塞条件。

5.1、send

(1)声明 
ssize_t send(int __fd, const void *__buf, size_t __n, int __flags)
(2)作用

向套接字__fd所指向的地址发送缓冲区__buf中长度为__n的数据。

(3)参数
参数名描述
__fd套接字文件描述符。
__buf缓冲区。
__n发送的数据长度。
__flags标志,这个在具体在其他篇幅讲。
(4)返回值
名称描述
成功返回发送的字节数。
失败-1
(5)阻塞条件

当要发送的消息长度大于套接字当前可用缓冲区时, send将阻塞。

5.2、recv

(1)声明 
ssize_t recv(int __fd, void *__buf, size_t __n, int __flags);
(2)作用

从套接字__fd接收长度为__n的数据放入缓冲区__buf中。

(3)参数
参数名描述
__fd套接字文件描述符。
__buf缓冲区。
__n接收的数据长度。
__flags标志,这个在具体在其他篇幅讲。
(4)返回值
名称描述
成功返回接收的字节数。
失败-1
(5)阻塞条件

recv函数会一直阻塞到接收缓冲区里有一个字节或一个完整的UDP数据报为止。

5.3、优化思路

我们平时一般的开发思路是单进程单线程从缓冲区中接收到数据,开始处理数据,处理完发送消息给服务端我收到消息,发送端再发数据,如果处理数据时间较长,是不是可能会出现类似状况呢。

如果需要改进,我的思路是开启两个线程,一个线程用于接收数据并将数据放入一个队列中,放入之后和客户端说我收到数据了,另一个线程从队列中拿数据进行处理,这样就不会一直等待。

6、查看计算节点

之前查看了一下计算节点,发现没有类似任务,刚开始还觉得这是都算完了,后来想了想,计算节点就不会有这个任务,因为管理节点和计算节点的DDL是同步的,只需要在拿到任务的管理节点计算即可。也不是个别计算节点慢导致的。

7、gccli执行SQL

我们可以用Gbase8a自带的客户端工具gccli放到本地来执行SQL,gccli具体使用方法可以参考之前的博客《南大通用数据库-Gbase-8a-学习-32-gccli客户端》,这样可以屏蔽网络的问题。

我手动执行了一下,差不多两分钟左右,gccli没有额外的数据处理过程,只是将数据fetch出来进行展示,上面程序处理慢的问题概率又大了几分。

猜想是否为问题原因
服务端网络负载高
客户端网络负载高权限问题,建议客户帮忙验证。
客户端程序处理数据慢有一定可能。

8、调整参数max_allowed_packet

参数适当调大后,效果不明显,已经调回原值。

说明通信时最大的包长度。即服务器和客户端通讯时,发送和接收的数据包或字符串的最大长度。
默认值64 * 1024 * 1024(单位:字节)
最小值1024(单位:字节)
最大值4L*1024L*1024L*1024L(单位:字节)
详细介绍1、设定单个报文或任何中间字符串(intermediate string)的最大长度,单位是字节。
2、报文消息缓冲由 net_buffer_length 参数进行设定,一般情况下,数据包的通讯缓冲区初始化为 8K字节 。 但其最终可以按需增长至max_allowed_packet 参数设定的大小。
3、这个参数值一般不需要设置的太大。较小的通讯缓冲区设置值可以捕获大的数据包,而那些大的数据包通常是由于异常引起的。
4、此参数的默认值较小,在使用了 BLOB 列或长字符串的场景中,应该增大其值至能容纳最大 BLOB 数据的长度。协议本身限定此值最大为 1G,参数只接受 1024 整数倍的数值,非 1024 的整数倍将会被自动圆整至离其最近的1024 整数倍的数值。

这篇关于南大通用数据库-Gbase-8a-学习-43-SQL长时间处于Writing to net状态排查的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/811798

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置