小编Aar*_*ang的帖子

与Node.js的长连接,如何减少内存使用并防止内存泄漏?也与V8和webkit-devtools有关

以下是我正在尝试做的事情:我正在开发一个Node.js http服务器,该服务器将在一台计算机上保存数千个移动客户端的推送目的(与redis协作)的长连接.

测试环境:

1.80GHz*2 CPU/2GB RAM/Unbuntu12.04/Node.js 0.8.16
Run Code Online (Sandbox Code Playgroud)

第一次,我使用"express"模块,在使用交换之前我可以使用它来达到大约120k并发连接,这意味着RAM不够.然后,我切换到本机"http"模块,我得到了大约160k的并发.但我意识到在本机http模块中仍然有太多功能我不需要,所以我把它切换到本机"net"模块(这意味着我需要自己处理http协议,但没关系).现在,每台机器可以达到大约250k并发连接.

这是我的代码的主要结构:

var net = require('net');
var redis = require('redis');

var pendingClients = {};

var redisClient = redis.createClient(26379, 'localhost');
redisClient.on('message', function (channel, message) {
    var client = pendingClients[channel];
    if (client) {
        client.res.write(message);
    }
});

var server = net.createServer(function (socket) {
    var buffer = '';
    socket.setEncoding('utf-8');
    socket.on('data', onData);

    function onData(chunk) {
        buffer += chunk;
        // Parse request data.
        // ...

        if ('I have got all I need') {
            socket.removeListener('data', onData);

            var req = { …
Run Code Online (Sandbox Code Playgroud)

javascript sockets linux tcp node.js

47
推荐指数
1
解决办法
1万
查看次数

关于node.js内部异步I/O机制的困惑

  1. 我已经了解到node.js在内部使用libeio来执行异步文件 I/O,使用线程池,在*nix平台上,我是对的吗?
  2. 那么异步网络 I/O呢?它是由libev完成的吗?还有线程池吗?
  3. 如果内部有线程池,那么它如何比传统的每线程请求模型更高效?每个I/O请求是一个线程吗?
  4. Windows上的机制是什么?我知道它是由IOCP完成的,并且有一个内核级线程池,对吧?
  5. 为什么linux没有像Windows IOCP这样的本机完全AIO机制呢?它将来会有吗?

根据昌昌的回答更新:

  1. 我快速查看了@changchang给出的源代码,发现默认的线程池大小可以通过UV_THREADPOOL_SIZE重置,我想知道在哪种情况下会使用这个?
  2. 我还发现getaddrinfo使用这个线程池,除了fs还有更多吗?如果所有同步作业都将在此线程池中完成,那么默认大小"4"是否足够?
  3. 正如我现在的理解,node.js进程中将有6个基本线程:1个V8线程(事件循环,用户javascript代码运行),1个libuv事件循环,4个线程池,我是对的吗?
  4. 我怎样才能在shell(Ubuntu)中看到这些线程?我用ps -eLf | grep节点| grep -v grep只看到两个:

    root 16148 7492 16148 0 2 20:43 pts/26 00:00:00 ./bin/node /home/aaron/workspace/test.js
    root 16148 7492 16149 0 2 20:43 pts/26 00:00:00./bin/node /home/aaron/workspace/test.js

javascript linux io node.js libuv

23
推荐指数
1
解决办法
6509
查看次数

MongoDB块与复合分片键平衡

假设我有三个分片,使用复合键{ x: 1, y: 1 }作为集合,x有三个int值:1,2,3,y是随机的.

然后我插入相同数量的文件x = 1,x = 2x = 3.我期待的是所有块的范围都x = 1去shard1,x = 2去shard2,x = 3去shard3,然后我可以有查询隔离.但输出是出乎意料的:

test.t6

shard key: { "x" : 1, "y" : 1 }

chunks:
shard0000   5
shard0002   5
shard0001   5
{ "x" : { "$minKey" : 1 }, "y" : { "$minKey" : 1 } } -->> { "x" : 1, "y" : 0 } on : shard0000 Timestamp(2, …
Run Code Online (Sandbox Code Playgroud)

sharding mongodb

0
推荐指数
1
解决办法
656
查看次数

标签 统计

javascript ×2

linux ×2

node.js ×2

io ×1

libuv ×1

mongodb ×1

sharding ×1

sockets ×1

tcp ×1