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) ​​​​​…

新媒体运营重点

新媒体运营是相对传统媒体(纸媒、电视等)产生的一个新的概念。新媒体运营的本质和传统媒体一样,通过内容宣传实现品牌曝光,提高企业、产品的知名度,从而帮助企业实现商业价值。 随着dou音、小红书、知hu等平台很多个人…

Mybatis全局配置介绍

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

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

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

Golang 中的强大 TUI 库 ——tview

在命令行界面下创建丰富的用户交互界面是许多开发者的需求,而 Golang 语言中有一个非常出色的 TUI(文本用户界面)库 ——tview。本文将详细介绍 tview 库,并与其他流行的 TUI 库进行对比,最后进行总结。 一、tview 库介…

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

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

尚硅谷rabbitmq 2024 Federation配置 第60节答疑

rabbitmq联邦队列怎么做 要在 RabbitMQ 中设置联邦队列(Federated Queues),你需要遵循以下步骤。联邦队列允许你在不同的 RabbitMQ 实例之间共享队列,从而实现消息的分布式处理和高可用性。 ### 步骤 1:安装 RabbitMQ…

线性规划:优化决策的数学工具

文章目录 一、引言二、线性规划的基本概念1. 决策变量2. 目标函数3. 约束条件 三、线性规划的数学模型四、线性规划的求解方法1. 图解法2. 单纯形法3. 其他算法 五、线性规划的应用场景1. 生产计划2. 投资组合优化3. 运输问题4. 资源分配 六、总结 一、引言 线性规划&#xff…

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…

编程题 7-18 二分法求多项式单根【PAT】

文章目录 题目输入格式输出格式输入样例输出样例 题解解题思路完整代码 编程练习题目集目录 题目 二分法求函数根的原理为&#xff1a;如果连续函数 f ( x ) f(x) f(x) 在区间 [ a , b ] [a,b] [a,b] 的两个端点取值异号&#xff0c;即 f ( a ) f ( b ) < 0 f(a)f(b)<…

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

一、svg图标 原视频 注意&#xff1a;图片是使用的png但是图标是使用的svg&#xff1b; &#xff08;1&#xff09;配置svg ①main.js里引入icons目录 ②调用函数遍历使用svg ③配置symbolId前都加了icon-&#xff0c;所以引用时应该加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…

Qt_打开其他软件(带参数)

文章内容: 当打开器他软件并要求其他软件做出响应动作时,我们可以通过传入参数来控制软件打开的方式。 打开软件: if(QString::compare(ui->btn_connect->text(), "断开连接") ==

MySQL学习(六):视图和存储过程以及函数

MySQL学习&#xff08;六&#xff09;&#xff1a;视图和存储过程以及函数 文章目录 MySQL学习&#xff08;六&#xff09;&#xff1a;视图和存储过程以及函数1. 视图1.1 视图的作用与特性1.2 视图的创建1.3 视图的查看与维护1.4 视图的修改与删除 2. 存储过程与函数2.1 存储过…

Windows 添加右键以管理员身份运行 PowerShell

在 Windows 系统中添加一个右键菜单选项&#xff0c;以便可以使用管理员权限打开 PowerShell&#xff0c;可以通过编辑注册表来实现。 打开注册表编辑器&#xff1a; 按 Win R 打开运行对话框。输入 regedit 并按回车&#xff0c;这将打开注册表编辑器。 导航到文件夹背景键&…