你好
我的环境如下:具有16个虚拟处理器和64 GB内存的虚拟机。我有一个小的测试csv文件,有十六万行。我正在以每个CPU一个线程的速度旋转16个线程,因此,每个线程分担一万行的工作量。每个线程都将一万行转换为等效的内存数据表。并且,直到此阶段,所有处理都在几秒钟内发生(从程序启动后不到7-10秒,并且在这个时间点上,我有16个内存数据表的集合,每个数据表包含一万行)。因此,磁盘IO在此阶段到此结束。从现在开始,进行CPU绑定处理。 16个线程中的每一个继续循环遍历它们各自的工作量,即万行内存数据表,并连接到数据库以更新其各自内存数据表中的列之一。观察到这万行的总吞吐量为90分钟,大约每分钟100行。 16个线程中的每个线程花费的时间完全相同,并且在这普通的90分钟内,所有16个线程都处理各自的一万行的工作负载。这看起来非常非常低的吞吐量。仔细研究数据库的周转时间,可以证明它很快,数据库可以在几毫秒/微秒内做出响应。循环中没有磁盘IO。在数据库中查找该值后,内存中的数据表将立即更新。而且,每条指令本身的执行速度都非常快(从记录的时间开始)。然而,已经观察到在循环内的连续编程指令之间,存在短的延迟,这可能是由于上下文/线程切换引起的。
问题11:在由16个虚拟处理器和64 GB内存组成的硬件设置中,程序以1:1的比例旋转线程(并且VM中几乎运行了零个用户程序),为什么会发生上下文切换?问题2:异步TPL异步编程可以在这里提供帮助吗-我认为这几乎没有帮助(请更正我),因为在等待数据库响应时程序无需执行任何操作。 for循环中几乎没有3或4条指令来处理一万行内存数据表,并且这些编程指令中的每条指令都取决于前一条编程指令的完成情况,X指令无法执行的所有操作-sync,同时仍在处理其前任指令(X-1)。 for循环中的这3或4条指令必须顺序执行。 X,X + 1和X + 2的发生速度以毫秒/微秒为单位。似乎根本原因是某些X和X + 1或(x-1)和x有时甚至是(X + 2)和(X + 3)之间的短暂延迟,从而使总体吞吐量每秒仅超过1行。
您能否分享您的看法?
谢谢
我的环境如下:具有16个虚拟处理器和64 GB内存的虚拟机。我有一个小的测试csv文件,有十六万行。我正在以每个CPU一个线程的速度旋转16个线程,因此,每个线程分担一万行的工作量。每个线程都将一万行转换为等效的内存数据表。并且,直到此阶段,所有处理都在几秒钟内发生(从程序启动后不到7-10秒,并且在这个时间点上,我有16个内存数据表的集合,每个数据表包含一万行)。因此,磁盘IO在此阶段到此结束。从现在开始,进行CPU绑定处理。 16个线程中的每一个继续循环遍历它们各自的工作量,即万行内存数据表,并连接到数据库以更新其各自内存数据表中的列之一。观察到这万行的总吞吐量为90分钟,大约每分钟100行。 16个线程中的每个线程花费的时间完全相同,并且在这普通的90分钟内,所有16个线程都处理各自的一万行的工作负载。这看起来非常非常低的吞吐量。仔细研究数据库的周转时间,可以证明它很快,数据库可以在几毫秒/微秒内做出响应。循环中没有磁盘IO。在数据库中查找该值后,内存中的数据表将立即更新。而且,每条指令本身的执行速度都非常快(从记录的时间开始)。然而,已经观察到在循环内的连续编程指令之间,存在短的延迟,这可能是由于上下文/线程切换引起的。
问题11:在由16个虚拟处理器和64 GB内存组成的硬件设置中,程序以1:1的比例旋转线程(并且VM中几乎运行了零个用户程序),为什么会发生上下文切换?问题2:异步TPL异步编程可以在这里提供帮助吗-我认为这几乎没有帮助(请更正我),因为在等待数据库响应时程序无需执行任何操作。 for循环中几乎没有3或4条指令来处理一万行内存数据表,并且这些编程指令中的每条指令都取决于前一条编程指令的完成情况,X指令无法执行的所有操作-sync,同时仍在处理其前任指令(X-1)。 for循环中的这3或4条指令必须顺序执行。 X,X + 1和X + 2的发生速度以毫秒/微秒为单位。似乎根本原因是某些X和X + 1或(x-1)和x有时甚至是(X + 2)和(X + 3)之间的短暂延迟,从而使总体吞吐量每秒仅超过1行。
您能否分享您的看法?
谢谢