我的任务是计算图表中的最大吞吐量。
描述图形的最简单方法是int[][]。内部数组是图中的节点,外部数组是连接图中每个节点的距离,例如:
new int[][] {
{0, 5, 0, 0}, // node 0 (the "source")
{0, 0, 4, 0}, // node 1
{0, 0, 0, 8}, // node 2
{0, 0, 0, 0} // node 3 (the "destination")
}
Run Code Online (Sandbox Code Playgroud)
因此,要从node 0(源)到node 3(目标),“最大吞吐量”将是每圈 4,因为:
在“每转”的基础上,瓶颈在node 1和之间node 2,其中最大吞吐量为 4。
可有人点我会解决这个“最大吞吐量”问题,以这种方式定义的任何给定的图形算法int[][],并给出source和destination节点?
示例图将使用多个“源”和“目的地”进行扩展,我将需要在任何给定的“转弯”上计算整个系统的最大吞吐量。
我很感激以学习算法或“伪代码”的形式提供的帮助。
我已经构建了可以在Windows 2003服务器上部署的软件。该软件作为服务连续运行,并且是Windows上对我来说很重要的唯一应用程序。有时,它是从Internet检索数据,而有时则是对这些数据进行一些计算。它是多线程的-我使用大约4-20个线程的线程池。
我不会为您带来所有这些细节,但是只要我在池中启用更多线程,就可以进行更多的并发工作,并且CPU使用率会增加。(对带宽等其他资源的需求也是如此,尽管这对我来说无关紧要-我有很多)
我的问题是:我是否应该简单地尝试最大程度地利用CPU来获得最大的收益?凭直觉,我认为以100%CPU运行是没有道理的。甚至95%的CPU似乎都很高,几乎就像我没有给OS太多的空间来做它需要做的事情。我不知道确定最佳平衡的正确方法。我猜想我可以进行测量,并且可能发现在90%或91%的CPU平均利用率等情况下可以实现最佳吞吐量,但是...
我只是想知道这是否有很好的经验法则???我不想假设我的测试将考虑工作负载的各种变化。我宁愿玩一点安全,但不要太安全(否则我的硬件使用不足)。
你有什么建议吗?对于Windows上的多线程混合负载(某些I / O,某些CPU)应用程序,明智的,注重性能的使用规则是什么?
我想创建一个C++服务器/客户端,通过我的localhost上的TCP套接字通信最大化吞吐量.作为准备,我使用iperf找出i7 MacBookPro上的最大带宽.
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 256 KByte (default)
------------------------------------------------------------
[ 4] local 127.0.0.1 port 5001 connected with 127.0.0.1 port 51583
[ 4] 0.0-120.0 sec 329 GBytes 23.6 Gbits/sec
Run Code Online (Sandbox Code Playgroud)
没有任何调整,ipref告诉我,我可以达到至少23.2 GBit/s.然后我做了我自己的C++服务器/客户端实现,你可以在这里找到完整的代码:https://gist.github.com/1116635
我的代码我基本上每次读/写操作传输一个1024bytes的int数组.所以我在服务器上的发送循环如下所示:
int n;
int x[256];
//fill int array
for (int i=0;i<256;i++)
{
x[i]=i;
}
for (int i=0;i<(4*1024*1024);i++)
{
n = write(sock,x,sizeof(x));
if (n < 0) error("ERROR writing to socket");
}
Run Code Online (Sandbox Code Playgroud)
我在客户端上的接收循环如下所示:
int x[256];
for (int i=0;i<(4*1024*1024);i++)
{
n …Run Code Online (Sandbox Code Playgroud) 我试图了解接收器窗口如何影响高延迟连接的吞吐量.
我在两台相距很远的机器上有一对简单的客户端 - 服务器应用程序,两者之间的连接是250毫秒延迟RTT.我使用Windows(XP,7)和Linux(Ubuntu 10.x)运行此测试,结果相同,所以为了简单起见,我们假设:客户端接收数据:WinXP Pro Server发送数据:Win7 Pro再次,延迟是250毫秒RTT.
我在不更改客户端上的接收器缓冲区大小的情况下运行TCP测试(默认为8Kb),我在线上看到(使用Wireshark):
查看跟踪,我看到3-4个数据包(有效载荷为1460字节)的突发,紧接着是从客户端机器发送到服务器的ACK,然后没有任何约250毫秒然后来自服务器的新数据包突发给客户.
因此,总而言之,服务器似乎甚至在填满接收者窗口之前就不会发送新数据.
为了做更多的测试,这次我还运行了相同的测试,在客户端机器上更改了接收器的缓冲区大小(在Windows上,更改接收器的缓冲区大小最终会影响机器公布的RWIN).我希望在阻止ACK之前看到大量的数据包突发...并且至少有更高的吞吐量.
在这种情况下,我将recv缓冲区大小设置为100,000,000.从客户端到服务器的数据包现在有一个RWIN = 99,999,744(好吧,那很好),但不幸的是从服务器发送到客户端的数据模式仍然是相同的:短暂的突发,然后是漫长的等待.为了确认我在线上看到的内容,我还测量了从服务器向客户端发送大量数据的时间.我没有看到使用大型RWIN或使用默认值的任何更改.
任何人都可以帮助我理解为什么更改RWIN并不会真正影响吞吐量?
很少有注意事项: - 服务器使用8Kb块的write()尽可能快地发送数据 - 正如我之前所说,我也看到了使用Linux的类似效果.更改接收器缓冲区大小会影响节点使用的RWIN,但吞吐量保持不变. - 我分析了数百个数据包之后的跟踪,给TCP足够的时间启动机制放大CWIN大小.
正如所建议的那样,我在这里添加了一条线迹的小快照
No. Time Source Destination Protocol Length Info
21 2.005080 CCC.CCC.CCC.CCC sss.sss.sss.sss TCP 60 57353 > 21500 [ACK] Seq=1 Ack=11681 Win=99999744 Len=0
22 2.005109 sss.sss.sss.sss CCC.CCC.CCC.CCC TCP 1514 21500 > 57353 [ACK] Seq=19305 Ack=1 Win=65536 Len=1460
23 2.005116 sss.sss.sss.sss CCC.CCC.CCC.CCC TCP 1514 21500 > 57353 [ACK] Seq=20765 Ack=1 Win=65536 Len=1460
24 …Run Code Online (Sandbox Code Playgroud) 我需要将应用程序的负载划分为一些百分比,即登录模块 - 60%,帐户 - 10%,其他模块 - 30%。经过一番研究后,我在 jmeter 的吞吐量控制器部分下找到了一个选项,使用它我可以控制这些百分比。我在那里找到一个名为“每个用户”的复选框。现在我没有得到这个复选框。
根据 blazemeter 博客,我尝试了如下一种场景,并选中了“每用户”复选框。
现在,根据博客,特定事务应该执行 400 次。但该交易的执行为零。
我尝试了另一种情况,选中了“每用户”复选框。
现在,根据博客,特定事务应该执行 600 次。但它执行了10次。
那里的专家可以分享我在这里做错了什么吗?或者需要更清楚地了解此复选框的工作原理。
这可能听起来像一个愚蠢的问题,但我仍然希望有人/专家回答/确认这一点。
假设我有一个 3 节点 cassandra 集群。假设我有一个数据库和一张表。对于这个单表,假设我使用 3 节点 cassandra 获得了 1K 写入/秒的吞吐量。如果明天我在此表上的写入负载增加/扩展到 10K 或 20K,我是否能够通过将集群大小增加 10 倍或 20 倍来处理此写入负载?
我对 cassandra 的理解表明这是可能的(因为 cassandra 既可读写又可扩展),但需要专家确认。
我对 193 个样本进行了 JMeter 测试,可以看到平均响应时间为 5915 毫秒,吞吐量为 1.19832。
我只是想知道它们到底有什么关系
我在JBoss 6.1应用服务器中使用HornetQ.我的应用程序(一个客户端应用程序,生成消息,以及消耗它们的JBoss应用程序)无法在服务器上处理超过4000 TPS,而CPU仍然是60%空闲.我试图删除持久性以检查我是否是磁盘绑定但它不会提高吞吐量.
似乎问题出在生产者方面.至少在监控队列大小时,它仍然非常小,这意味着消费者不是瓶颈.
我应该使用几个队列来提高效率吗?我已经阅读过HornetQ的性能调优文档,但找不到原因.或者可能是因为我使用的是AUTO_ACKNOWLEDGE模式?我正在为生产者运行几个线程,这不应该影响很多.生产者JVM无论如何都不能使用超过1个CPU线程.我甚至试图运行我的生产者应用程序的几个实例,但它不会更快.网络带宽很高(1 Gbps),我的消息非常小(<1 KB).此外,生产者和消费者应用程序在同一服务器上运行.HornetQ配置在2台服务器的JBoss集群中.
我想知道是否有人观察到,与通过 Windows 命令提示符执行 FTP 获取/放置或使用 Perl 的Net::FTP模块相比,使用 Python 的ftplib通过 ftp 下载或上传文件所花费的时间非常长。
我创建了一个类似于http://code.activestate.com/recipes/521925-python-ftp-client/的简单 FTP 客户端,但是我无法达到在 Windows DOS 提示符下运行 FTP 或使用 perl 时获得的速度. 是我遗漏了什么还是Python ftplib 模块有问题。
如果您能说明为什么我使用 Python 的吞吐量很低,我将不胜感激。
在 100Gb 网络上,我创建了一个服务器来监听 4 个端口,grpc 客户端可以达到 3GB+/s 的吞吐量。但是,当服务器监听一个端口时,grpc 客户端的吞吐量仅为 1GB/s,即使我设置
args.SetInt(GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES, 1024*1024*1024);
args.SetInt(GRPC_ARG_MAX_CONCURRENT_STREAMS, 10);
好像 grpc 客户端只能同时使用一个连接到一个端口服务。我对吗?
正确的做法是什么?
我的代码在这里:
客户端:https : //github.com/gongweibao/tests/blob/develop/grpc_test/client.cc
服务器:https : //github.com/gongweibao/tests/blob/develop/grpc_test/server.cc
throughput ×10
performance ×3
jmeter ×2
algorithm ×1
bandwidth ×1
c++ ×1
cassandra ×1
cpu ×1
ftp ×1
ftplib ×1
graph ×1
grpc ×1
hornetq ×1
jboss ×1
jboss6.x ×1
latency ×1
load-testing ×1
max ×1
networking ×1
python ×1
scalability ×1
sockets ×1
tcp ×1