- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想实现每秒 5-1 百万次远程函数调用。假设我们有一台开始计算的 Central
计算机,还有一台执行计算的 Worker
计算机。实际配置中会有很多Worker计算机。
假设我们的任务是计算一个[(random int from 0 to MAX_VAL)*2], PROBLEM_SIZE 次的总和
非常幼稚的原型(prototype)是
worker :
//The real function takes 0.070ms to compute.
int compute(int input) {
return input * 2;
}
void go() {
try {
ServerSocket ss = new ServerSocket(socketNum);
Socket s = ss.accept();
System.out.println("Listening for " + socketNum);
DataInput di = new DataInputStream(s.getInputStream());
OutputStream os = s.getOutputStream();
byte[] arr = new byte[4];
ByteBuffer wrap = ByteBuffer.wrap(arr);
for (; ; ) {
wrap.clear();
di.readFully(arr);
int value = wrap.getInt();
int output = compute(value);
wrap.clear();
byte[] bytes = wrap.putInt(output).array();
os.write(bytes);
}
} catch (IOException e) {
System.err.println("Exception at " + socketNum);
e.printStackTrace();
}
}
中央:
void go(){
try {
Socket s = new Socket(ip, socketNum);
s.setSoTimeout(2000);
OutputStream os = s.getOutputStream();
DataInput di = new DataInputStream(s.getInputStream());
System.out.println("Central socket starting for " + socketNum);
Random r = new Random();
byte[] buf = new byte[4];
ByteBuffer wrap = ByteBuffer.wrap(buf);
long start = System.currentTimeMillis();
long sum = 0;
for(int i = 0; i < n; i++) {
wrap.clear();
int value = r.nextInt(10000);
os.write(wrap.putInt(value).array());
di.readFully(buf);
wrap.clear();
int answer = wrap.getInt();
sum += answer;
}
System.out.println(n + " calls in " + (System.currentTimeMillis() - start) + " ms");
} catch(SocketTimeoutException ste) {
System.err.println("Socket timeout at " + socketNum);
}
catch (Exception e) {
e.printStackTrace();
}
如果 ping 为 0.150 毫秒并且我们运行 1 线程 Worker 和 1 线程 Central,则每次迭代将花费 ~0.150 毫秒。为了提高性能,我在 Worker 和 Central 上运行了 N
个线程,第 n
个线程监听端口 2000+n
。每个线程停止后,我们总结结果。
基准
首先,我在我同事的学校网络中运行了上面的程序。其次,我在两个 Amazon EC2 集群实例上运行它。结果差距很大。
CHUNK_SIZE = 100_000
在所有运行中。
伙伴网络:
我认为 3 年前它是可用的顶级配置 (Xeon E5645)。我相信它针对并行计算进行了大量优化,并且具有简单的 LAN 拓扑,因为它只有 20 台机器。
操作系统:Ubuntu
平均 ping:~0.165 毫秒
N=1 total time=6 seconds
N=10 total time=9 seconds
N=20 total time=11 seconds
N=32 total time=14 seconds
N=100 total time=21 seconds
N=500 total time=54 seconds
亚马逊网络:
我在同一个放置组中启动的两个集群计算 8 超大型实例 (cc2.8xlarge) 上运行该程序。
操作系统是一些amazonian linux
平均 ping:~0.170 毫秒。
结果有点令人失望:
N=1 total time=16 seconds
N=10 total time=36 seconds
N=20 total time=55 seconds
N=32 total time=82 seconds
N=100 total time=250 seconds
N=500 total time=1200 seconds
每个配置我都运行了 2-4 次,结果都差不多,大部分是 +-5%
Amazon N=1 结果是有道理的,因为每个函数调用 0.170 毫秒 = 每秒 6000 次调用 = 每 16 秒 100_000 次调用。 Fellow 的网络 6 秒实际上是令人惊讶的。
我认为现代网络每秒的最大 TCP 数据包约为每秒 40-70k。对应N=100,time=250秒:N*CHUNK_SIZE/time = 100 * 100_000packets/250sec = 10_000_000packets/250sec = 40_000packets/second。
问题是,我的 Fellow 的网络/计算机配置是如何做到如此出色的,尤其是在高 N 值的情况下?
我的猜测:将每个 4 字节的请求和 4 字节的响应放入单独的数据包是一种浪费,因为有大约 40 字节的开销。明智的做法是将所有这些微小的请求集中起来,比如 0.010 毫秒,并将它们放在一个大数据包中,然后将请求重新分配到相应的套接字。可以在应用程序级别实现池化,但似乎 Fellow 的网络/操作系统已配置为执行此操作。
更新:我玩过 java.net.Socket.setTcpNoDelay(),它没有改变任何东西。
最终目标:我使用非常大的树来近似具有数百万个变量的方程。目前,具有 200_000 个节点的树适合 RAM。但是我很想近似方程,它需要具有数百万个节点的树。这将需要几 TB 的 RAM。算法的基本思想是采用从节点到叶子的随机路径,并沿路径改进值。当前程序是 32 线程的,每个线程每秒执行 15000 次迭代。我想将它移动到每秒迭代次数相同的集群中。
最佳答案
您可能希望启用 Nagle 算法:wikipedia entry .
这里有一个关于禁用它的链接可能会有帮助:Disabling Nagle's Algorithm in linux
关于java - 每秒 100 万次远程函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15026384/
为了让我的代码几乎完全用 Jquery 编写,我想用 Jquery 重写 AJAX 调用。 这是从网页到 Tomcat servlet 的调用。 我目前情况的类似代码: var http = new
我想使用 JNI 从 Java 调用 C 函数。在 C 函数中,我想创建一个 JVM 并调用一些 Java 对象。当我尝试创建 JVM 时,JNI_CreateJavaVM 返回 -1。 所以,我想知
环顾四周,我发现从 HTML 调用 Javascript 函数的最佳方法是将函数本身放在 HTML 中,而不是外部 Javascript 文件。所以我一直在网上四处寻找,找到了一些简短的教程,我可以根
我有这个组件: import {Component} from 'angular2/core'; import {UserServices} from '../services/UserService
我正在尝试用 C 实现一个简单的 OpenSSL 客户端/服务器模型,并且对 BIO_* 调用的使用感到好奇,与原始 SSL_* 调用相比,它允许一些不错的功能。 我对此比较陌生,所以我可能会完全错误
我正在处理有关异步调用的难题: 一个 JQuery 函数在用户点击时执行,然后调用一个 php 文件来检查用户输入是否与数据库中已有的信息重叠。如果是这样,则应提示用户确认是否要继续或取消,如果他单击
我有以下类(class)。 public Task { public static Task getInstance(String taskName) { return new
嘿,我正在构建一个小游戏,我正在通过制作一个数字 vector 来创建关卡,该数字 vector 通过枚举与 1-4 种颜色相关联。问题是循环(在 Simon::loadChallenge 中)我将颜
我有一个java spring boot api(数据接收器),客户端调用它来保存一些数据。一旦我完成了数据的持久化,我想进行另一个 api 调用(应该处理持久化的数据 - 数据聚合器),它应该自行异
首先,这涉及桌面应用程序而不是 ASP .Net 应用程序。 我已经为我的项目添加了一个 Web 引用,并构建了各种数据对象,例如 PayerInfo、Address 和 CreditCard。但问题
我如何告诉 FAKE 编译 .fs文件使用 fsc ? 解释如何传递参数的奖励积分,如 -a和 -target:dll . 编辑:我应该澄清一下,我正在尝试在没有 MSBuild/xbuild/.sl
我使用下划线模板配置了一个简单的主干模型和 View 。两个单独的 API 使用完全相同的配置。 API 1 按预期工作。 要重现该问题,请注释掉 API 1 的 URL,并取消注释 API 2 的
我不确定什么是更好的做法或更现实的做法。我希望从头开始创建目录系统,但不确定最佳方法是什么。 我想我在需要显示信息时使用对象,例如 info.php?id=100。有这样的代码用于显示 Game.cl
from datetime import timedelta class A: def __abs__(self): return -self class B1(A):
我在操作此生命游戏示例代码中的数组时遇到问题。 情况: “生命游戏”是约翰·康威发明的一种细胞自动化技术。它由一个细胞网格组成,这些细胞可以根据数学规则生存/死亡/繁殖。该网格中的活细胞和死细胞通过
如果我像这样调用 read() 来读取文件: unsigned char buf[512]; memset(buf, 0, sizeof(unsigned char) * 512); int fd;
我用 C 编写了一个简单的服务器,并希望调用它的功能与调用其他 C 守护程序的功能相同(例如使用 ./ftpd start 调用它并使用 ./ftpd stop 关闭该实例)。显然我遇到的问题是我不知
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
我希望能够从 cmd 在我的 Windows 10 计算机上调用 python3。 我已重新安装 Python3.7 以确保选择“添加到路径”选项,但仍无法调用 python3 并使 CMD 启动 P
我是一名优秀的程序员,十分优秀!