操作系统版本:
目前已知Windows Server 2016 / 2019
问题描述:
当操作系统中添加 远程桌面服务 角色后,使用数据库客户端远程连接数据库,导出数据时速度会变慢,未安装 远程桌面服务角色前,导出大约花费45秒左右,安装后导出大约花费520秒左右,相差12倍左右。
但是,卸载 远程桌面服务 角色后,导出数据的速度就恢复了正常,所以推断跟 远程桌面服务 角色有关系。
对操作系统的CPU、内存、磁盘、网络系统资源进行性能测试,在导出数据慢时,资源使用率非常低,所以确定系统资源充足,没有影响到导出数据时间。
对数据网络传输时间和数据写磁盘时间进行统计,发现导出数据变慢,主要是写入磁盘比较慢。
问题原因:
问题比较难解决,找到了数据库相关方面的研发人员,也无法确定问题的原因,最后只能找微软公司帮助解决问题。
微软的工作人员通过使用 Process Monitor工具对导出数据的过程进行了分析,得出如下结论:
在导出速度快时,调用的堆栈如下
//调用栈如下
0 FLTMGR.SYS FltpPerformPreCallbacks
1 FLTMGR.SYS FltpPassThroughInternal
2 FLTMGR.SYS FltpPassThrough
3 FLTMGR.SYS FltpDispatch
4 ntoskrnl.exe IopSynchronousServiceTail
5 ntoskrnl.exe NtWriteFile
6 ntoskrnl.exe KiSystemServiceCopyEnd
7 ntdll.dll ZwWriteFile
8 KernelBase.dll
9 java.dll java.dll
10 java.dll java.dll
11 java.dll java.dll
在导出慢的时,调用堆栈如下
传输较慢的日志中,可以看到java在写完初始文件后,就没有再写文件了,最后一直是在做网络传输,这个时候其实是系统进程在写日志
//具体调用栈如下,可以看到这时候是由TSFairShare这个文件在写文件
0 FLTMGR.SYS FltpPerformPreCallbacksWorker
1 FLTMGR.SYS FltpInternalCompletePendedPreOperation
2 FLTMGR.SYS FltCompletePendedPreOperation
3 TSFairShare.sys I_CompletePendedIo C:\Windows\system32\drivers\TSFairShare.sys
4 TSFairShare.sys TSFSContinuePendedIo
5 TSFairShare.sys CTSSchedulerMgr::ContinueProcessIo
6 TSFairShare.sys CTSSchedulerMgr::ProcessNextWorkItem
7 TSFairShare.sys CTSSchedulerMgr::TSSchedulerWorkerThread
8 TSFairShare.sys CTSSchedulerMgr::staticTSSchedulerWorkerThread
9 ntoskrnl.exe PspSystemThreadStartup =
10 ntoskrnl.exe KiStartSystemThread
产生报错原因:
根据微软内部资料显示,安装rdsh的角色,就会block ODX 的快速传输机制,所以导致传输缓慢。
解决办法 :
修改注册表,禁用TSFairShare功能。
在注册表中,有磁盘、网络、CPU资源启用了TSFairShare,此将以下三个键值EnableFairShare由1修改为0,然后重启计算机。也不用全都修改为0,根据自己的实际情况修改,我这里是导出数据时,写入磁盘慢,因为只禁用磁盘的TSFairShare就可以了。
磁盘
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TSFairShare\Disk\EnableFairShare
网络
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TSFairShare\NetFS\EnableFairShare
CPU
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Quota System\EnableFairShare