使用套接字进行进程间通信的限制是什么?

5
我正在创建一个Firefox扩展程序,允许在Firefox中使用Standard ML(SML)作为客户端编程语言。它的工作方式如下:
1. 扩展程序启动PolyML进程(带有顶级交互式shell的SML编译器)。 2. 然后,在扩展程序和PolyML进程之间建立套接字通信。 3. 从网页读取SML代码,并通过套接字将其发送到PolyML进程进行评估。 4. 该代码随后可以使用我提供的用于操作DOM的库。
以下是DOM库的实现方式:
1. 假设某人执行了一个SML函数DOM.getElementById 2. 此请求通过套接字转发到扩展程序,扩展程序在页面上执行JavaScript函数getElementById并通过套接字将结果发送回PolyML进程。
我的问题是,在理论上,当涉及到套接字通信时,我应该期望什么样的性能限制?
我进行了一些非常粗略的分析,似乎使用扩展程序和PolyML之间的这个接口,我可以大约每秒发送2500条消息,平均每条消息大小为70字节。

更具体地说,假设我想在浏览器中使用Canvas元素绘制一些动画。如果我想要实现20fps,那意味着我需要在0.05秒内绘制每一帧,这意味着我每帧只能发送大约125个消息。这些消息对应于JavaScript函数调用。例如,下面的代码绘制了一条路径并进行了9次JavaScript函数调用,这对应于套接字通信中的9个消息。

val _ = Canvas.beginPath context;
val _ = Canvas.setFillStyle context fillColor;
val _ = Canvas.setStrokeStyle context fillColor;
val _ = Canvas.setLineWidth context size;
val _ = Canvas.moveTo context posx posy;
val _ = Canvas.lineTo context posx_new posy_new;
val _ = Canvas.stroke context;
val _ = Canvas.arc context posx_new posy_new (size/2.0) 0.0 6.28 true;
val _ = Canvas.fill context;

显然,JavaScript的性能更好,我想你可以在0.05秒内进行数千(百)次Canvas/DOM函数调用,以绘制一帧。

所以,我的问题是,您是否有使用socket通信进行非常快速的消息交换的经验。我想知道每秒2500个小消息(在这种情况下,相当于150 kbytes /秒)是否合适,或者我可能做错了什么。

例如,有一个怀疑是Firefox中的socket实现(特别是通过JavaScript接口https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIServerSocket使用它)对于这种快速交互不是很好。例如,从socket读取是通过事件循环机制完成的。也就是说,我依赖Firefox..来通知我有关传入socket消息的可用性,有时在发送消息和接收消息之间存在较大的延迟(例如250毫秒),尽管这似乎只发生在Firefox正在忙于其他事情时,并且我更感兴趣的是..socket通信的理论极限。

任何想法,任何想法,任何缺陷您看到了吗?您认为使用其他IPC机制会更好,例如管道,从C ++ XPCOM组件实现我的通信,而不是从JavaScript,外部函数接口到C(JavaScript和PolyML都有)?
(如果有人感兴趣,该项目位于https://assembla.com/wiki/show/polymlext

你正在使用TCP?UDP?还是UNIX套接字?后者应该更快,因为操作系统不必考虑网络错误。 - bew
不确定,我正在使用https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIServerSocket。你知道它们是TCP、UNIX还是可配置的吗? - Karolis
我也意识到瓶颈可能是JSON编码/解码,尽管我不记得那里有多少被使用了。 - Karolis
如果我理解源代码正确的话,nsIServerSocket总是使用AF_INET,即使是用于本地连接。http://scottmoonen.com/tag/af_inet/ 对两者进行了比较:在AF_UNIX下,100GB的传输需要80.575200秒,在AF_INET + loopback下,100GB的传输需要226.717520秒。 - bew
在我看来,TCP足够快,并且可以跨平台使用。据我所知,Windows上没有UNIX套接字。你最大的问题将是数据序列化。 - James Mills
1个回答

1
TCP可以调整以获得更高的吞吐量或更快的响应时间。要获得更高的吞吐量,需要将套接字缓冲区设置为较大的值。要使用较小的数据块获得良好的响应时间,需要设置TCP_NODELAY套接字选项。如果对环回上的TCP进行优化,则应该与任何IPC机制相同。新的Windows操作系统会对环回适配器进行特殊优化,例如增加MTU大小等,以使其更快。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接