- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在 go 中编写了一个程序,它充当 samba 共享的简单 HTTP 接口(interface):用户向 http://proxy.example.com/?path=\\repository\foo\bar.txt
发出 get 请求。和 \\repository\foo\bar.txt
通过 http.ServeFile(或多或少)提供。
然而,表现却很糟糕。我运行了一些基准测试,结果让我很难过。对于上下文,图中有三台机器:samba 服务器(文件所在的位置)、代理服务器(go 程序运行的地方)和最终用户的机器(我最终希望文件获取的地方)。 samba 服务器和代理服务器位于同一位置,最终用户相距很远。
使用 Windows 副本从 samba 机器直接复制到用户机器的运行速度约为 1.5MB/s。这对我来说已经足够了,也是我在代理服务中的目标。
不幸的是curl 'http://proxy.example.com/?path=\\repository\foo\bar.txt' > bar.txt
来自用户机器的时钟大约为 150KB/s。
那么,让我们看看 samba 服务器和代理服务器之间是否存在连接问题。从 samba 服务器到代理服务器的副本看起来正在……大约 15MB/s。
嗯,也许这是一件好事?我将编写一个 go 程序来衡量传输速度。
src, _ := os.Open("\\\\repository\\foo\\bar.txt")
start := time.Now()
written, _ := io.Copy(ioutil.Discard, src)
elapsed := time.Since(start)
bytesPerSecond := written/int64(elapsed/time.Second)
http://proxy.example.com/?path=\\repository\foo\bar.txt
, 15MB/秒。
bar.txt
到代理服务器并在 url 中使用其本地路径,
\mycoolfiles\bar.txt
.呵呵,1.5MB/s。
C:\mycoolfiles
设置为名为
\\alexscoolfiles
的网络共享, 和
http://proxy.example.com/?path=\\alexscoolfiles\bar.txt
时钟在,dun dun dun,150KB/s。
最佳答案
在试图准确地追踪我可以在何处以及在什么情况下重现该问题之后,我终于将其归结为一行:如果我注释掉 io.Copy 使用 ReadFrom 的位置(当前 io/io.go
,第 358 行),我将获得最大吞吐量.
检查 ReadFrom 的实现位置( net/http/server.go
,第 381 行):
// ReadFrom is here to optimize copying from an *os.File regular file
// to a *net.TCPConn with sendfile.
net/sendfile_windows.go
,它调用 TransmitFile 系统调用,在它和我们的各种服务器配置之间的某个地方发生了一些不好的事情。
type writerOnly struct {
io.Writer
}
//...
io.Copy(writerOnly{w}, f)
//...
关于windows - 在 go 中提供 samba 文件的矛盾性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29358125/
在 Coq 中,我有两个假设 H 和 H0 ,它们相互矛盾。问题是,它们只是在某些特化方面相互矛盾,而在证明的这一刻,上下文并不是那么特化。 此时我的证明上下文如下所示: color : Vertex
根据 RubyMonk section 8.1模块只保存行为而不保存状态,类可以保存行为和状态。 然而,模块是 Ruby 中类的父类(super class)。怎么会这样? 最佳答案 哦兄弟,如果你忘
来自此处的文档:http://facebook.github.io/react/docs/pure-render-mixin.html 脚注说如果复杂数据(深层数据结构)的结构发生变化,你应该使用fo
我有一个简单的类(class) function TrueNinja() { this.vanish = function() { return this; }; } 由此创建一个新对象 var
这个问题在这里已经有了答案: How do Python's any and all functions work? (10 个答案) 关闭 4 年前。 无意中发现了Numpy中的一些东西,实在看不
这个问题在这里已经有了答案: C++ doesn't tell you the size of a dynamic array. But why? (7 个回答) 关闭3年前。 我到处都读到,在 C+
编辑以提供完整的代码示例和特定问题 我正在编写一个函数来生成股票价格的时间序列图。但是,出现以下错误 eval(expr,envir,enclos)中的错误:找不到对象'df1234' 这是该函数的示
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在阅读 Stroustrup 的 C++(1997 年第 3 版)以了解他是如何实现 RAII 的,在第 365 页上我发现了这一点: class File_ptr{ FILE* p; p
A class S is a standard-layout class if it: [class.prop]/(3.7) : has no element of the set M(S) of t
我是一名优秀的程序员,十分优秀!