我正在运行一个相当大规模的 Node.js 0.8.8 应用程序,它使用具有 16 个工作进程的集群,在一个具有超线程的 16 个处理器的机器上(所以 32 个逻辑核心)。我们发现,自从迁移到 Linux 3.2.0 内核(从 2.6.32 开始)后,工作子进程之间传入请求的平衡似乎被重压到 5 个左右的进程,而其他 11 个根本没有做太多工作。这可能对吞吐量更有效,但似乎会增加请求延迟,对我们来说并不是最佳选择,因为其中许多是可以同时开始工作的长期 Websocket 连接。
子进程都在一个套接字上接受(使用 epoll),虽然这个问题在 Node 0.9 中有一个修复(https://github.com/bnoordhuis/libuv/commit/be2a2176ce25d6a4190b10acd1de9fd53f7a6275),但该修复似乎没有帮助我们的测试。是否有人知道内核调整参数或构建选项可能会有所帮助,或者我们是否最好回到 2.6 内核或使用不同的方法跨工作进程进行负载平衡?
我们将其归结为一个简单的 HTTP Siege 测试,但请注意,这是在具有超线程(即 24 个逻辑核心)的 12 核机器上使用 12 个 proc 运行,并且在套接字上接受 12 个工作进程,而不是到我们的 16 个生产过程中。
在裸机上使用 2.6.32 内核的 Debian Squeeze 上使用 Node 0.9.3 的 HTTP Siege:
reqs pid
146 2818
139 2820
211 2821
306 2823
129 2825
166 2827
138 2829
134 2831
227 2833
134 2835
129 2837
138 2838
除了 3.2.0 内核之外的所有内容都相同:
reqs pid
99 3207
186 3209
42 3210
131 3212
34 3214
53 3216
39 3218
54 3220
33 3222
931 3224
345 3226
312 3228
最佳答案
不要依赖操作系统的套接字多重接受来平衡 Web 服务器进程之间的负载。
Linux 内核的行为因版本而异,我们看到 3.2 内核的行为特别不平衡,在以后的版本中似乎更加平衡。例如3.6.
我们的操作是假设应该有一种方法可以让 Linux 用这个来做类似循环的事情,但是这有很多问题,包括:
您可以在我们用来与优秀的 Node.js 团队通信的 github 问题上详细查看我们的测试,从这里开始:https://github.com/joyent/node/issues/3241#issuecomment-11145233
该对话以 Node.js 团队结束,表示他们正在认真考虑在集群中实现显式循环,并为此提出一个问题:https://github.com/joyent/node/issues/4435 ,并与 Trello 团队(也就是我们)一起制定我们的后备计划,即使用本地 HAProxy 进程在每台服务器机器上的 16 个端口上进行代理,每个端口上运行一个 2-worker-process Cluster 实例(为了快速在进程崩溃或挂起的情况下在接受级别进行故障转移)。该计划运行良好,请求延迟的变化大大减少,平均延迟也更低。
这里还有很多要说的,我没有采取邮寄 Linux 内核邮件列表的步骤,因为不清楚这是否真的是 Xen 或 Linux 内核问题,或者真的只是一个错误的预期我们的多个接受行为。
我很想看到关于多重接受的专家的回答,但我们将回到我们可以使用我们更了解的组件构建的内容上。如果有人发布更好的答案,我会很高兴接受它而不是我的。
关于linux - Linux 3.2 内核与 2.6 内核的不平衡套接字接受,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13770826/
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成
一段时间以来,我一直在使用open_uri下拉ftp路径作为数据源,但突然发现我几乎连续不断地收到“530抱歉,允许的最大客户端数(95)已经连接。”我不确定我的代码是否有问题,或者是否是其他人在访问服务器,不幸的是,我无法真正确定谁有问题。本质上,我正在读取FTPURI:defself.read_uri(uri)beginuri=open(uri).readuri=="Error"?nil:urirescueOpenURI::HTTPErrornilendend我猜我需要在这里添加一些额外的错误处理代码...我想确保我采取一切预防措施来关闭所有连接,这样我的连接就不是问题所在,但是我
我有一个ActiveRecord对象,我想在不对模型进行永久验证的情况下阻止它被保存。您过去可以使用errors.add执行类似的操作,但它看起来不再有效了。user=User.lastuser.errors.add:name,"namedoesn'trhymewithorange"user.valid?#=>trueuser.save#=>true或user=User.lastuser.errors.add:base,"myuniqueerror"user.valid?#=>trueuser.save#=>true如何在不修改用户对象模型的情况下防止将用户对象保存在Rails3.2中
我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d
在Ruby(1.8.X)中为什么Object既继承了内核又包含了内核?仅仅继承还不够吗?irb(main):006:0>Object.ancestors=>[Object,Kernel]irb(main):005:0>Object.included_modules=>[Kernel]irb(main):011:0>Object.superclass=>nil请注意,在Ruby1.9中情况类似(但更简洁):irb(main):001:0>Object.ancestors=>[Object,Kernel,BasicObject]irb(main):002:0>Object.included
Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好
文章目录一基础定义二创建逻辑卷2-1准备物理设备2-2创建物理卷2-3创建卷组2-4创建逻辑卷2-5创建文件系统并挂载文件三扩展卷组和缩减卷组3-1准备物理设备3-2创建物理卷3-3扩展卷组3-4查看卷组的详细信息以验证3-5缩减卷组四扩展逻辑卷4-1检查卷组是否有可用的空间4-2扩展逻辑卷4-3扩展文件系统五删除逻辑卷5-1备份数据5-2卸载文件系统5-3删除逻辑卷5-4删除卷组5-5删除物理卷六LVM逻辑卷缩容6-1缩容注意事项6-2标准缩容步骤一基础定义LVM,LogicalVolumeManger,逻辑卷管理,Linux磁盘分区管理的一种机制,建立在硬盘和分区上的一个逻辑层,提高磁盘分
如何在Ruby中获取linux系统(这必须适用于Fedora、Ubuntu等)的软件/硬件信息? 最佳答案 Chef背后的优秀人才,拥有一颗名为Ohai的优秀gemhttps://github.com/opscode/ohai以散列形式返回系统信息,例如操作系统、内核、规范、fqdn、磁盘、空间、内存、用户、接口(interface)、sshkey等。它非常完整,非常好。它还会安装命令行二进制文件(也称为ohai)。 关于ruby-如何在Ruby中获取linux系统信息,我们在Stack