POPPUR爱换

 找回密码
 注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

搜索
查看: 5957|回复: 6

Windows下用UNC路径拷贝LAN另一机上4G文件 那机器内存占用也增4G 已找到1种解决方法

[复制链接]
发表于 2009-1-20 11:47 | 显示全部楼层 |阅读模式
本帖最后由 overpro 于 2009-1-22 01:18 编辑

两台机器,暂且叫做Server/Client

Server: Q6600, onda G35T 主板集成Marvell Yukon千兆网卡具体型号没看,Server2003 R2 X64, 8G内存
Client: 4200+, nv 570Ultra, 集成千兆网卡(型号忘啦),XP X64 sp2,4G内存

在Client上利用UNC路径访问Server复制4G文件到Client上,发现Server 内存可用数变成3xxxMB了,考完文件即恢复正常。 然后测试了一个8G文件,等文件复制到快完成时候Server内存耗尽,开始和硬盘作交换了,接着拷贝速度就突然很慢了。

在公司的机器上试验过却没有发现这个现象,拷贝一个3G文件,源机内存占用并没有这么明显的变化。
怀疑是Marvell Yukon这个网卡驱动导致的,今天回家试试看从Client复制大文件到Server,看看啥结果.另外手头有个TP-LINK PCI千兆网卡空着呢,也装上试试看啥结果,

1-20 1913
回来以后测试了一下,从Client上COPY一个4G文件到Server, Client的内存占用率也是和文件尺寸相同,Client是Realtek RTL8168/8111 PCI-E Gigabit Ethernet NIC。
用的是Switch连接的两台机器。 大家是否也有同样的现象呢?

解决方法请看6#
 楼主| 发表于 2009-1-20 23:46 | 显示全部楼层
又有点儿新发现:
如果在Client上登录,把大文件(4G的) 复制到远程的Server上,此时Client和Server内存占用都没什么大幅度变化,在Server上做同样的“上传式操作”也没有问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-1-21 01:07 | 显示全部楼层
本帖最后由 overpro 于 2009-5-4 16:32 编辑


当Client拷贝Server上的文件到Client自己的硬盘上时, 如上图所示, SystemCache数值在不停的增加 ,这是拷贝了完成了两个4G文件后的显示:SystemCache变成7.5G,在拷贝过程中Available数值很小,只要复制完成Available就恢复到上面这个样子了:7.3G.
系统刚刚启动的时候SystemCache数值很小,随着大文件复制,这个数值也不断增长,到一定时候上面的Available数量开始骤减,减少的数量和SystemCache增加的数量基本等量,都是每秒40-50MB的样子。
我已经尝试在System.properties>advanced>performace>advanced里把"How to allocate system memory"改成Programs了, 依然无效,系统总是用光一切能用的内存然后就开始换页。
回复 支持 反对

使用道具 举报

发表于 2009-1-21 10:43 | 显示全部楼层
进来看看,顶一下
回复 支持 反对

使用道具 举报

发表于 2009-1-21 17:31 | 显示全部楼层
我是用FTP, 2003做FTP Server, 另一台Vista直接用资源管理器把FTP里面的文件往移动硬盘拽的时候(拽的内容大概30多G)Vista的C盘4G多的剩余空间会吃干净, 文件拽完了空间还不退还, 只有重启才行.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-1-22 00:43 | 显示全部楼层
本帖最后由 overpro 于 2009-5-4 16:33 编辑

OK, 昨天晚上找到了一个文章说大文件copy的内存占用问题的
http://blogs.technet.com/askperf ... le-copy-issues.aspx
昨天的测试也能看出来其实是由于文件复制的时候操作系统使用了内存把那些大文件缓冲起来了,操作系统不管文件有多大,都会进行缓冲,这样做是为了性能上的考虑,对于那些需要经常访问、更新的文件来说这是有好处的。但是对于那种在网络上或者本机上复制的大文件来说这个特性会导致性能较差,因为系统内存被占用光然后开始换页,这会带来更多的磁盘IO,拷贝速度会一落千丈。

Server2003 +sp1与  Vista的解决方法:
MS在server2003,sp1和Vista里提供了一个新的系统函数,就是一个winAPI,有人直接做了个exe文件,
细节这里不说了,可以用它设置文件缓冲区大小,
http://www.uwe-sieber.de/files/setsystemfilecachesize.zip
用法如下:
SetSystemFileCacheSize.exe 显示当前最大、最小缓冲区容量
SetSystemFileCacheSize.exe off 1024 取消缓冲区最小限制,设置最大缓冲为1024MB
SetSystemFileCacheSize.exe off off 取消最小最大限制
SetSystemFileCacheSize.exe 10 off 缓冲区最小10MB, 没有上限
很简单的,我重复了之前的测试,非常有效。
在xp机上登录,从server2003上用UNC路径拽两个4.5G文件过来,在Server2003上使用performance counter查看结果,下图是使用了SetSystemFileCacheSize.exe  off 512的结果:

请看上图中黄色线就是可用内存数(比例:0.01。64代表6400MB),绿线是磁盘IO队列数量。左边60%的部分是在拷贝文件,右边可用内存恢复到了70左右并且磁盘IO队列降下来了,说明此时文件拷贝完成了。可以看到前后差别确实只有5xxMB并且拷贝9G内容没有吃光物理内存。
再看下图是使用SetSystemFileCacheSize.exe  off off关闭缓冲上限以后的Performance counter统计结果

可以看到可用内存数量不停的减少,如果要拷贝xxGB的文件,系统就不行了。
所以Server2003 SP1 以后及Vista的系统请用上面那个exe文件控制缓冲区大小,注意重启以后需要重设,所以最好写个bat放到开机自动执行里让他自动运行一下.这里补充一下: 放到Startup里面并不好,因为系统启动古时候那些service也跟着启动了比如FTP等等,而Startup只会在用户登录时候才运行,可以写个Service专门启动这个(虽然用c#写没几行,但是这个听起来太重量级了),潜水的程序员童鞋们请提出你们的好方法。  

下面是xp的处理方法:
使用ntcacheset - 一个基于Sysinternal CacheSet的工具,就是CacheSet外面包了一层。
http://www.uwe-sieber.de/files/ntcacheset.zip
需要vb6运行时支持
ftp://ftp.microsoft.com/Softlib/MSLFILES/vbrun60.exe

由于XP和Server2003sp1,vista的一些区别,它只能周期性的检查缓冲区大小并限制其数量,Sysinternal CacheSet做不到这一点,所以就有人用vb写了上面这个ntcacheset,用来周期性监测,用法如下,很简单:
NtCacheSet /int=10000 /min=4096 /max=65536
/int sets the interval in milliseconds (10000 ms = 10 s)
/min sets the minimum value--KB
/max sets the maximum value--KB
如果想取消这个进程,只需重新运行一下ntcacheset.exe即可
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-1-22 01:15 | 显示全部楼层
我是用FTP, 2003做FTP Server, 另一台Vista直接用资源管理器把FTP里面的文件往移动硬盘拽的时候(拽的内容大概30多G)Vista的C盘4G多的剩余空间会吃干净, 文件拽完了空间还不退还, 只有重启才行.
aboutblank 发表于 2009-1-21 17:31

aboutblank童鞋,请你也在Server2003上试试看那个SetSystemFileCache.exe吧,试验好了把结果分享一下?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

广告投放或合作|网站地图|处罚通告|

GMT+8, 2024-4-19 09:16

Powered by Discuz! X3.4

© 2001-2017 POPPUR.

快速回复 返回顶部 返回列表