我想开发一个复杂的游戏,可能有数千个函数和数据库调用.
我想知道是否真的有必要在异步中进行数据库查询.编写代码很麻烦,我的所有函数都需要使用回调而不是clean return方法.这是正常的做法吗?
考虑到MySQL数据库一次处理一个查询,是否真的更快地将这些调用编码为异步?
问候,
我一直在研究javascript,nodejs.我不明白如何在javascript中避免并发问题.
让我们说我正在研究一个物体
var bigObject = new BigObject();
Run Code Online (Sandbox Code Playgroud)
我有一个setTimer(function(){ workOnBigOjbect...} )也会做的工作bigOjbect.
如果我正在写入磁盘IO bigObject,并且计时器对象正在处理bigObject,并且定期进行代码读取bigObject,那么如何避免并发问题?
在常规语言中,我将使用互斥或线程安全队列/命令模式.我也没有看到很多关于javascript竞争条件的讨论.
我错过了什么吗?
编辑(2):现在使用db-mysql和generic-pool模块.错误率显着下降,徘徊在13%,但吞吐量仍然在100 req/sec左右.
编辑(1):在有人建议ORDER BY RAND()会导致MySQL变慢之后,我从查询中删除了该子句.Node.js现在徘徊在100 req/sec左右,但服务器仍然报告"CONNECTION error:Too many connections".
你可能看到了很多"Hello World"对node.js进行基准测试......但是"hello world"测试,甚至那些每个请求延迟2秒的测试,甚至都没有接近真实世界的生产用量.我还使用node.js执行了"Hello World"测试的那些变体,并且看到吞吐量大约为800 req/sec,错误率为0.01%.但是,我决定进行一些更现实的测试.
也许我的测试不完整,很可能关于node.js或我的测试代码真的是错误的,所以如果你是node.js专家,请帮我写一些更好的测试.我的结果发表在下面.我使用Apache JMeter进行测试.
测试非常简单.用户数量的mysql查询是随机排序的.检索并显示第一个用户的用户名.mysql数据库连接是通过unix套接字.操作系统是FreeBSD 8+.8GB的RAM.Intel Xeon四核2.x Ghz处理器.在我遇到node.js之前,我稍微调整了Lighttpd配置.
线程数(用户):5000 我相信这是并发连接数
加速期(以秒为单位):1
循环次数:10 这是每个用户的请求数
Label | # Samples | Average | Min | Max | Std. Dev. | Error % | Throughput | KB/sec | Avg. Bytes HTTP Requests Lighttpd | 49918 | 2060ms | 29ms | 84790ms | 5524 | 19.47% | 583.3/sec | 211.79 | 371.8 HTTP Requests Node.js …
我有一个运行长期执行进程的应用程序.为了使速度更快,我进行简单的数据分片并希望并行运行它们,只需通过.fork()相同应用程序的2个实例.
我在那里有2台核心机器,并希望确保使用2个核心,第一个实例在第一个核心上运行,第二个核心在第二个核心上运行.
我知道cluster模块,但在这种情况下似乎不相关,因为我不需要运行HTTP服务并在它们之间进行负载平衡.只是工人(意思是,他们不需要彼此沟通,发送消息或其他任何东西 - 他们只是做HTTP请求并将数据存储到数据库).
是否有可能控制node.js进程采用哪个CPU内核?如何在Mac/Linux上监控?
Javascript是单线程的.那么回调函数和它的包含函数是否在与主循环/事件循环相同的线程上执行?
database.query("SELECT * FROM hugetable", function(rows) { // anonymous callback function
var result = rows;
console.log(result.length);
});
console.log("I am going without waiting...");
Run Code Online (Sandbox Code Playgroud)
如果query()方法及其回调函数在与事件循环相同的线程上执行,则会发生阻塞.如果不是为什么Javascript被称为单线程?
任何人都可以帮助验证javascript(browser/node.js)是否在场景后面使用多个线程以实现非阻塞?
谢谢,
朋友们,我看到了你的意见和答案.对不起,我对javascript很新.我很困惑,单线程asyn调用不会阻塞.如果有100个用户从hugeTable请求数据,这可能每个并发一分钟,并且事件循环将这些任务分配到一个队列并依次执行它们,query()方法执行如何不阻止事件循环,因为它们全部打开一个单线程?
布拉德回答了这一部分
我想设置4个不同的node.js实例,每个实例都在自己的核心上.node.js是否在同一个核心上堆叠新实例,还是将它们设置在新核心上?
实例不相关并单独接收请求.我希望cpu负载均匀分布.我无法找到这个问题的明确答案.
是否可以将函数作为完全独立的node.js进程运行?例如:
var parallel = require("parallel");
parallel(function(){
var app = require("express")();
app.on("/",function(req,res){ res.send("hi"); });
app.listen(80);
},function callback(err,stdout){
console.log("process terminated!")
});
Run Code Online (Sandbox Code Playgroud)
有可能吗?
我用JMeter创建了测试来测试Ghost博客平台的性能.Ghost用Node.js编写,安装在1Gb RAM,1个CPU的云服务器上.
我注意到400个并发用户JMeter收到错误后.直到400个并发用户负载是正常的.我决定增加CPU并增加1个CPU.
但错误再现并增加了2个CPU,共4个CPU.在400个并发用户之后出现问题.
我不明白为什么1个CPU可以处理400个用户,而4个CPU可以处理相同的结果.
在监视期间,我注意到只有一个CPU忙,另外三个CPU空闲.当我在控制台中检查JMeter摘要时出现错误,大约是请求的5%.见截图.

我想知道是否可以平衡CPU之间的负载?
我是Node.js的新手。我已经建立了我的第一个Node.js服务器。我正在做一些研究,以提高生产中的节点js服务器的性能。因此,我了解了NGINX和流程管理器(PM2)。
NGINX:
PM2:
我们可以同时用于生产吗?
虽然PM2中有负载均衡器,但是我只能使用PM2吗?
使用NGINX而不是PM2有什么优势?
如果我使用NGINX的负载平衡器和PM2的群集,是否会比仅使用一个负载均衡器(NGINX或PM2)提供更好的性能?
我有一个缓慢的内存泄漏的应用程序,由于各种原因,我无法摆脱.因此,我想使用让我的工人定期死亡和复活的旧技巧.
(即在多处理池中使用与maxtasksperchild相同的策略......"......在其他系统(例如Apache,mod_wsgi等)中找到的频繁模式可以释放工作人员所拥有的资源,这样可以让池中的工作人员完成退出之前只有一定数量的工作,被清理并产生一个新的过程以替换旧的......")
到目前为止,我能够想到的最好的方法是让一个线程可以休眠,然后再打电话os._exit(-1).
这是要走的路,还是有更好的方法定期回收我的工人?
这是我现在要走的路:
class Quitter(Thread):
def run(self):
while True:
time.sleep(random.randrange(5, 7)):
print str(os.getpid())
os._exit(-1)
Quitter().start()
Run Code Online (Sandbox Code Playgroud)
Gunicorn响应:
2013-03-13 03:21:24 [6487] [INFO] Booting worker with pid: 6487
...
2013-03-13 03:21:30 [6492] [INFO] Booting worker with pid: 6487
Run Code Online (Sandbox Code Playgroud) node.js ×8
javascript ×4
asynchronous ×2
concurrency ×2
cpu ×1
cpu-usage ×1
express ×1
fork ×1
gunicorn ×1
jmeter ×1
jquery ×1
lighttpd ×1
mysqli ×1
nginx ×1
performance ×1
php ×1
pm2 ×1
python ×1
webserver ×1