SQLServer-ASYNC_NETWORK_IO等待事件

文章目录

  • 客户端应用程序出现问题
  • 网络问题

ASYNC_NETWORK_IO 是一种经常被DBA看到的等待类型,当其数值过高时可能会让人担忧,因为这是最难解决的等待类型之一。
需要知道的是,从 SQL Server 2005 开始,这种等待类型被命名为 ASYNC_NETWORK_IO,而在 SQL Server 2000 中,这种等待类型称为 NETWORKIO。这一等待类型的原始名称源自 10M和 100 M慢速以太网速度的时代,这些速度通常在 2000 年代中期之前广泛使用。
大多数情况下,该等待类型的过高数值实际上与网路问题无关(或这是一个非常罕见的情况),尤其是在如今 40Gb、100Gb 的超高速以太网时代,甚至目前正在开发的 200Gb 和 400Gb 速度的网络中。
ASYNC_NETWORK_IO 等待过高可能发生在以下两种情况下:

  1. 客户端应用程序需要处理从 SQL Server 接收到的数据,然后才能向 SQL Server 发送信号,表示它可以接受新数据进行处理。这是一种常见的情况,通常反映出应用程序设计不佳,这也是导致 ASYNC_NETWORK_IO 等待过高的最常见原因。
  2. 网路带宽已达到极限。一个拥堵的以太网将导致应用程序之间数据传输变慢,从而降低应用程序的效率。

客户端应用程序出现问题

SQL Server 中 ASYNC_NETWORK_IO 等待类型过高的最常见原因是应用程序无法快速处理从 SQL Server 接收的数据。当应用程序请求大量数据结果集时,缓慢的数据处理会导致数据缓冲区被填满,从而阻止 SQL Server 向客户端发送新数据。「逐行痛苦处理」(Row by Agonizing Row,简称 RBAR)往往是导致此类行为和高 ASYNC_NETWORK_IO 等待类型的原因。在 RBAR 应用程序编程中,每次只处理 SQL Server 发送的结果集中一行数据。在这种情况下,可处理的完整结果集会被缓存,然后通知 SQL Server 该数据集已经「处理完毕」。这将允许 SQL Server 在应用程序处理缓存的结果集数据时发送新的数据集。

当使用 RBAR 处理的应用程序必须处理非常大的数据库环境 (VLDB) 时,往往会遇到数据处理问题。执行批处理的伺服器进程(SPID)将被迫等待,直到应用程序开始处理缓冲区中的数据,这样 SQL Server 才能通过缓冲区将新的结果集发送到客户端。在等待将应用程序请求的新数据发送到缓冲区进行进一步处理的过程中,会产生 ASYNC_NETWORK_IO 等待类型。
在这里插入图片描述
当 SQL Server 上出现高 ASYNC_NETWORK_IO 等待类型值时,DBA 应该调查导致过高 ASYNC_NETWORK_IO 等待类型值的应用程序,通常还需要与开发该应用程序的开发人员进行协调。在调查高 ASYNC_NETWORK_IO 等待类型值时,应检查以下内容:

  • 检查应用程序是否请求了来自 SQL Server 实例的大量数据集,然后在客户端对这些数据进行过滤。特别要留意诸如 Microsoft Access 或 ORM 软件(对象关系映射)之类的第三方应用程序,它们可能请求了大量数据集并在客户端进行过滤。使用“立即读取,之后处理”的编程方法,通常可以避免出现过高的 ASYNC_NETWORK_IO 等待类型值。
  • 确保为客户端应用程序创建了适当的视图,以确保数据过滤在 SQL Server 实例上完成,从而显著减少传输到客户端应用程序的数据量。
  • 确保应用程序正在提交已打开的事务,并且及时提交它们。
  • 检查是否可以通过直接在 SQL Server 上进行数据过滤来减少请求的数据集。
  • 对于个别或临时查询,确保尽可能添加 WHERE 子句,并适当优化查询以限制请求的数据集只包含所需的数据。
    检查是否可以在查询中使用“TOP n”以减少查询返回的行数。
    标量值用户定义函数(UDF)由于逐行处理(RBAR)通常是导致高 ASYNC_NETWORK_IO 等待类型的原因,因此要查找这些影响性能的对象实例。
    使用带有用户定义函数(UDF)的计算列并在大数据库中使用,通常也是由于 RBAR 导致高 ASYNC_NETWORK_IO 等待类型的原因。
    在 SQL Server 2016 中,可以使用本机编译的 UDF(用户自定义函数),通常可以显著减少 RBAR 并将执行速度提高多达 100%。这在无法将 UDF 重构为table-valued(表值)函数的情况下特别有用。
    注意: SQL Server Management Studio (SSMS) 是一个恶名昭彰的客户端应用程式,因为它会产生大量ASYNC_NETWORK_IO 等待类型。SSMS 以逐行的方式读取资料流,并在处理每一行后才检索下一行。

此外,当在处理 SQL Server 上的大量数据加载过程中,遇到过度的 ASYNC_NETWORK_IO 等待时,也可以通过直接调整 SQL Server 来进行一些其他操作:

  • 如果尚未启用,为该 SQL Server 实例启用 Shared memory protocol 。
    使用以下查询来确定当前连接使用的协议:
SELECT net_transport
FROM sys.dm_exec_connections
WHERE session_id = @@SPID;
  • 確保客戶端使用 net_transport=‘Shared memory’ 進行連接。

如果以上所有检查都完成,但 SQL Server 仍然受到高 ASYNC_NETWORK_IO 等待值的影响,那么就该检查可能导致这种行为的网络相关问题了。这些问题通常由物理网络的限制、故障或仅仅是错误的网络设置引起。为了排除网络引起的 ASYNC_NETWORK_IO 等待,应仔细检查以下内容。

网络问题

  • 检查 SQL Server 和客户端之间的网络带宽。网络适配器速度慢且带宽与客户端应处理的数据量不匹配,通常是造成高 ASYNC_NETWORK_IO 等待值的常见原因。100 兆位的适配器仍然存在,并且通常无法满足现代 SQL Server 数据库和处理数据的需求。即使切换到 1 千兆位适配器,对于许多环境来说,系统仍然达不到当前的要求。使用 10 千兆位网络适配器被认为是大多数环境的最低标准,而 200 千兆位和 400 千兆位是许多企业在不久的将来必须切换的标准,如果他们还没有这么做的话。
  • 检查每秒批量请求(Batch requests per second)的计数器值,因为这通常可以表明高 ASYNC_NETWORK_IO 等待的原因。在检查批量请求时,需要检查的是 SQL Server 处理的 T-SQL 批量数量,因为这将决定 SQL Server 每秒处理的批量数量。每秒批量请求值超过 1000 的服务器被认为是“繁忙”的。建议的值会依赖于实际的系统配置、活动水平和处理的事务数量。在高峰时段,这个值显著增加并不罕见。
    当每秒批量请求(Batch requests per second)的计数器值接近或超过 3,000 并且使用的是 100 兆位网络时,这几乎可以肯定地表明网络速度是瓶颈,并导致高 ASYNC_NETWORK_IO 等待值。如今的服务器每秒轻松处理超过 20,000 批量请求,因此考虑将 1 千兆位或更低的网络升级到 10 千兆位,以满足 SQL Server 数据处理日益增长的需求是明智的选择。
  • 检查网卡(NIC)带宽利用率是明智的,但经常被忽视。
    使用 Perfmon 工具,可以通过以下公式轻松计算网络利用率:
    Network utilization %= ((Total Bytes\Sec * 8)/current bandwidth) * 100
    如果利用率的数值经常超过 60%,那么建议切换到更快的网卡或提高网络带宽,以确保在需要时能够分配足够的带宽来进行数据处理。
  • 确保网卡的自动协商功能正确检测到网络带宽。
    要检查所有活动网络连接的当前速度,可以使用以下命令行命令。
 Get-WmiObject -namespace "root\cimv2" -query 'select * from Win32_NetworkAdapter'| Where-Object { $_.NetEnabled -eq $true } | Select-Object Name, Speed

output:

Name                                        Speed
----                                        -----
Hyper-V Virtual Ethernet Adapter      10000000000
Realtek PCIe GBE Family Controller     1000000000
Npcap Loopback Adapter                 1215752192
Microsoft KM-TEST Loopback Adapter     1215752192
Hyper-V Virtual Ethernet Adapter #2   10000000000
Hyper-V Virtual Ethernet Adapter #3   10000000000
Hyper-V Virtual Ethernet Adapter #4   10000000000
VirtualBox Host-Only Ethernet Adapter  1000000000
Hyper-V Virtual Ethernet Adapter #5   10000000000

如果特定适配器的自动协商未选择正确的网络速度,则可以在 NIS 属性中手动设置 NIC 速度
在这里插入图片描述

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

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

相关文章

Android Compose使用LinearProgressIndicator绘制显示异常

使用依赖版本 androidx.compose.material3:material3:1.3.0-beta05 对应代码 LinearProgressIndicator(progress { 0.7f })直接使用上述代码绘制进度条时,最终显示效果如下: 问题原因 LinearProgressIndicator中gapSize属性表示进度和背景之前的空…

00 springboot项目创建

我们创建SpringBoot项目有两种方式: Spring Initializr spring initerzie 方式创建: 启动类, 依赖 生成,但是需要网络maven的方式 maven方式创建: 启动类, 依赖, 这些都需要手动编写,但是不需要网络 springboot系列,最近持续更新中,如需要请关注 如果…

RTSP RTP RTCP SDP基础知识

理论 流(Streaming ) 是近年在 Internet 上出现的新概念,其定义非常广泛,主要是指通过网络传输多媒体数据的技术总称。 流式传输分为两种 顺序流式传输 (Progressive Streaming) 实时流式传输 (Real time Streaming) ​​​​​…

Mybatis全局配置介绍

【mybatis全局配置介绍】 mybatis-config.xml,是MyBatis的全局配置文件,包含全局配置信息,如数据库连接参数、插件等。整个框架中只需要一个即可。 1、mybatis全局配置文件是mybatis框架的核心配置,整个框架只需一个&#xff1b…

Go 项目如何集成类似mybatisPlus插件呢?GORM走起!!

导读: 在 Go 项目中,虽然没有像 MyBatis Plus 这样特定的 ORM 插件,但可以使用功能相似的 Go ORM 框架,比如 GORM,它支持链式查询、自动迁移、预加载等功能,与 MyBatis Plus 有相似之处。通过一些插件或扩…

【JavaEE】——TCP应答报文机制,超时重传机制

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:TCP协议(面试重点重点) 1:报头长度 2:…

Linux学习网络编程学习(TCP和UDP)

文章目录 网络编程主要函数介绍1、socket函数2、bind函数转换端口和IP形式的函数 3、listen函数4、accept函数网络模式(TCP&UDP)1、面向连接的TCP流模式2、UDP用户数据包模式 编写一个简单服务端编程5、connect函数编写一个简单客户端编程 超级客户端…

国产单片机及其特点

国产单片机在近年来取得了显著的发展,不仅在技术上不断突破,还在市场上占据了越来越重要的位置。 主要国产单片机品牌及特点 兆易创新(GD) 主要系列:GD32系列,基于ARM Cortex-M内核。特点:高性能…

PDT 数据集:首个基于无人机的高精密度树木病虫害目标检测数据集

2024-09-24,由中国山东计算机科学中心、北京大学等机构联合创建了Pests and Diseases Tree(PDT)数据集,目的解决农业领域中病虫害检测模型开发中专业数据集缺失的问题。通过集成公共数据和网络数据,进一步推出了Common…

前端笔记(二):svg图标;git

一、svg图标 原视频 注意:图片是使用的png但是图标是使用的svg; (1)配置svg ①main.js里引入icons目录 ②调用函数遍历使用svg ③配置symbolId前都加了icon-,所以引用时应该加icon- ④但是使用时没有加因为组件里…

2024.10.15 sql

刷题网站&#xff1a; 牛客网 select device_id as user_infos_example from user_profile where id < 2 select device_id, university from user_profile where university"北京大学" select device_id, gender, age, university from user_profile where ag…

计算机毕业设计Django+Vue.js豆瓣图书推荐系统 图书评论情感分析 豆瓣图书可视化大屏 豆瓣图书爬虫 数据分析 图书大数据 大数据毕业设计 机器学习

《DjangoVue.js豆瓣图书推荐系统》开题报告 一、研究背景与意义 1. 研究背景 随着数字化时代的来临&#xff0c;图书资源日益丰富&#xff0c;用户面临着信息过载的问题。如何在海量图书中快速找到符合个人兴趣和需求的书籍成为了亟待解决的问题。传统的图书检索方式往往基于…

javaweb以html方式集成富文本编辑器TinyMce

前言&#xff1a; 单一的批量图片上传按钮&#xff0c;禁用tinymce编辑器&#xff0c;但是还可以操作图片编辑&#xff1b; 多元化格式的富文本编辑要求&#xff1b; 采用tinymce实现。 附&#xff1a; tinymce中文手册网站&#xff1a; http://tinymce.ax-z.cn/download-all.…

空间解析几何 3:空间点到线段和平面的距离【附MATLAB代码】

目录 空间中点到线段的距离 空间中点到平面的投影和距离 matlab代码 空间中点到线段的距离 空间中点到平面的投影和距离 matlab代码 function [dis,P2,t] point2Line (A1,B1,C1) %求空间一点到一线段的最短距离 %[dis,P2,Q2]pointSegmentDistance(A,B,C) %A B为线段首末端…

使用LlamaFactory进行模型微调

使用LlamaFactory进行模型微调 简介 论文地址&#xff1a;https://arxiv.org/pdf/2403.13372 仓库地址&#xff1a;https://github.com/hiyouga/LLaMA-Factory/tree/main 名词解释 1. 预训练 (Pre-training, PT) 预训练是指模型在大规模无监督数据集上进行初步训练的过程…

最强 OpenAI o1 逻辑推理正确率仅 50%!清华、智谱推出「大模型逻辑推理新基准」

9.11 和 9.9 哪个大&#xff1f; 这一连人类幼儿园儿童都能回答的问题&#xff0c;曾经&#xff08;至今&#xff09;难倒了众多大语言模型&#xff08;LLM&#xff09;。 然而&#xff0c;要想达到通用人工智能&#xff08;AGI&#xff09;的水平&#xff0c;LLM 不仅要完成“…

居民小区的有序充电策略及解决方案

0引言 全球经济增长导致化石能源过度消耗&#xff0c;加剧环境污染。电动汽车因其环保优势迅速崛起&#xff0c;预计到2030年中国电动汽车保有量将达到6000万辆。这有助于减少化石能源依赖&#xff0c;推广绿色出行&#xff0c;但也对电网稳定性构成挑战。因此&#xff0c;研究…

2.1 HTML5 - Canvas标签

文章目录 引言Canvas标签概述定义实例&#xff1a;创建画布 理解Canvas坐标系概述实例&#xff1a;获取Canvas坐标 获取Canvas环境上下文概述实例&#xff1a;获取Canvas上下文设置渐变色效果 结语 引言 大家好&#xff0c;今天我们要一起探索HTML5中一个非常有趣且强大的特性…

001 Hadoop安装、Spring整合测试

Hadoop安装、整合测试 文章目录 Hadoop安装、整合测试1.简介1.优点2.组成 2.安装1.安装jdk&#xff08;如已安装可跳过&#xff09;2.安装hadoop1.安装2. 修改配置文件core-site.xml3. 修改配置文件hdfs-site.xml4.启动hadoop5.启动yarn6.执行jps查看7.相关端口及配置位置8.访问…

python中不变的数据类型有哪些

在Python中&#xff0c;不可变&#xff08;immutable&#xff09;数据类型是指一旦创建了这些类型的对象后&#xff0c;就不能改变其值。Python中的不可变数据类型包括以下几种&#xff1a; 数字 (int, float, complex): 这些类型的数值一旦创建就不能更改。例如&#xff0c;如…