正如问题标题所暗示的那样,我很难弄清楚可以在我的应用程序上进行哪些改进(或在 os、ubuntu 中进行调整)以达到可接受的性能。但首先我将解释架构:
前端服务器是一台运行 Ubuntu 12.04 的 8 核机器,具有 8 个演出内存。该应用程序完全用 javascript 编写并在 node.js v 0.8.22 中运行(因为某些模块似乎在较新版本的节点上抱怨)我使用 nginx 1.4 将 http 流量从端口 80 和 443 代理到被管理的 8 个节点工作器并开始使用节点集群 api。我使用最新版本的 socket.io 0.9.14 来处理 websocket 连接,我只启用了 websockets 和 xhr-polling 作为可用传输。在这台机器上,我还运行了一个 Redis(2.2) 实例
我将持久数据(如用户和分数)存储在 mongodb(3.6) 上的第二台服务器上,具有 4gigs RAM 和 2 个内核。
该应用程序从几个月开始就投入生产(直到几周前它一直在一个机器上运行)并且每天有大约 18,000 名用户使用它。除了一个主要问题:性能下降之外,它一直工作得很好。随着使用,每个进程使用的 cpu 量会增加,直到它达到工作人员(不再为请求提供服务)为止。我暂时解决了它每分钟检查每个工人正在使用的cpu,如果达到98%则重新启动它。所以这里的问题主要是cpu,而不是RAM。RAM不再是问题,因为我已经更新到socket.io 0.9.14(早期版本正在泄漏内存)所以我怀疑这是一个内存泄漏问题,特别是因为现在它是cpu增长相当快(我必须每天重启每个工人大约 10-12 次!)。老实说,正在使用的 RAM 也在增长,但是很慢,每使用 2-3 天 1 gig,奇怪的是,即使我完全重新启动整个应用程序,它也没有发布。只有在我重新启动服务器时才会释放它!这我真的无法理解......
我现在发现nodefly很棒,所以我终于可以看到我的生产服务器上发生了什么,并且我从几天开始收集数据。如果有人想查看图表,我可以让您访问,但基本上我可以看到我有 80 到 200 个并发连接!我期待 node.js 处理数千个请求,而不是数百个请求。此外,http 流量的平均响应时间在 500 到 1500 毫秒之间浮动,我认为这确实很多。此外,在这个有 1300 个用户在线的时刻,这是“ss -s”的输出:
Total: …Run Code Online (Sandbox Code Playgroud) 我正在尝试为 RHEL/CentOS/SL 5 和 6 编写单个 rpm 规范。此规范适用于 python 应用程序,因此构建过程没有区别。但是在 RHEL/CentOS5 上,我需要添加一个额外的依赖项。
我将如何仅为 el5 定义依赖项?我试过以下:
%if 0%{?redhat} == 5 || 0%{?centos} == 5
Requires: kmod-coretemp
%endif
Run Code Online (Sandbox Code Playgroud)
不起作用(在 CentOS5 上构建不会添加 kmod-coretemp 依赖项)。
我也试过以下:
%if %{?dist} == "el5"
Run Code Online (Sandbox Code Playgroud)
它报告语法错误。我确定 dist 宏已设置并包含“el5”。但我不确定 rpm 中 if 条件的语法是什么?rpmguide 没有详细的答案。
有没有办法在木偶清单中定义硬链接?
似乎文件类型只能定义符号链接,但我需要它是硬链接才能使我的一些 chroot 应用程序工作。例如,我需要硬链接
/etc/hosts -> $chroot/etc/hosts
/etc/resolvf.com -> $chroot/etc/resolv.conf
Run Code Online (Sandbox Code Playgroud)
等等。
存档的最简单方法是什么?
更新:谢谢,我已经结束了以下定义:
define hardlinkdir(source=$name, target) {
exec {
"hardlinkdir-$name":
command => "cp -r --link $target $source",
path => "/usr/bin:/bin",
creates => $source;
}
}
define hardlink(source=$name, target) {
exec {
"hardlink-$name":
command => "ln --force $target $source",
path => "/usr/bin:/bin",
unless => "test $source -ef $target";
}
}
Run Code Online (Sandbox Code Playgroud)
当然,它们并不完美,但它们可以胜任,这是我需要的一切。
感谢您的帮助!
我基于 php cloudformatino 映像 ami-6fc2f61b 创建了一个新的 ec2 实例,并将我现有的密钥附加到它。安全组允许 ssh 和 http。但是,我无法连接:
$ ssh -v -i /cygdrive/c/data/copy/pk.pem ec2_user@host
OpenSSH_5.9p1, OpenSSL 0.9.8r 8 Feb 2011
debug1: Connecting to host [46.xx.xx.xx] port 22.
debug1: Connection established.
debug1: identity file /cygdrive/c/data/copy/pk.pem type -1
debug1: identity file /cygdrive/c/data/copy/pk.pem-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
debug1: match: OpenSSH_5.3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.9
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client …Run Code Online (Sandbox Code Playgroud) 我想在使用 sshfs 安装驱动器时使用 arcfour 密码。但是,如果我指定sshfs -o Ciphers=arcfour我的虚拟机重置连接(我可以在没有此选项的情况下进行 sshfs)。有什么办法可以使这项工作?我这样做是为了让 sshfs 执行得更快(我也关闭了压缩)。
我已经在 RHEL 中安装了带有 ipv6 支持版本 2.9.0.2 IPv6 (Build 92) 的 snort。谁能告诉我如何在我尝试过的 linux 中启用 ipv6 支持
sysctl -w net.ipv6.conf.all.forwarding=1
Run Code Online (Sandbox Code Playgroud)
和
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
Run Code Online (Sandbox Code Playgroud)
并重新启动了服务网络,但仍然出现错误
Bringing up interface eth0: Global IPv6 forwarding is enabled in configuration
, but not currently enabled in kernel.
Run Code Online (Sandbox Code Playgroud)
然后我添加net.ipv6.conf.all.forwarding=1了.etc/sysctl.conf ,然后现在重新启动我没有看到上面的错误消息,但我没有看到来自 ipv6 的转发
任何人都可以请帮忙