我有一个简单的finagle thrift服务器:
import com.twitter.finagle.Thrift
import scala.concurrent.Future
import com.twitter.util.{ Await, Future }
object Main{
def main(args: Array[String]) {
var count = 0
val myserver = Thrift.serveIface("0.0.0.0:9090", new RealTimeDatabasePageImpressions[com.twitter.util.Future] {
def saveOrUpdate(pageImpression: PageImpressions):
com.twitter.util.Future[Boolean] = {
count += 1
println(count)
com.twitter.util.Future.value(true)
}
}
Await.ready(myserver)
}
}这个服务器可以工作,但是我有一个很大的问题:我写了一个带有for循环的节俭nodejs客户端。它执行10.000节俭请求。但它不是异步的。它执行500个请求并停止。过了一段时间,2到3秒后,会有300多个请求被执行。现在的问题是:为什么会发生这种情况?我的服务器或客户端有问题吗?我只使用apache thrift生成的nodejs代码。没有包装器。该函数执行了10.000次。我认为nodejs不是问题所在:
function callFunc(i){
console.log("started executing: " + i);
var connection = thrift.createConnection("IP", 9090, {
transport: transport,
protocol: protocol
});
connection.on('error', function (err) {
console.log(err);
});
// Create a Calculator client with the connection
var client = thrift.createClient(Realtime_pageImpressions, connection);
var rand = Math.random() * (20000 - 1);
var trackId = trackIds[Math.round(Math.random() * 10)];
var values = new PageImpressions({
trackId: trackId,
day: 4,
hour: 4,
minute: 13,
pageId: 'blabla',
uniqueImpressions: Math.random() * (13000 - 1),
sumImpressions: Math.random() * (1000450 - 1)
});
client.saveOrUpdate(values, function (error, message) {
if (message) {
console.log("Successful, got Message: " + message);
} else {
console.log("Error with Message: " + error);
}
});
return true;
}
for(var i = 0; i < 10000; i++){
callFunc(i);
}发布于 2016-06-04 21:27:45
您的var count未同步。这是一个非常大的问题,但可能与您的性能问题无关。您还阻塞了finagle线程,这也是一个大问题,但在您的模拟情况下无关紧要,因为没有等待时间。
这样想吧。比方说,您有一个cpu (您可能有多个cpu,但机器上还有其他事情要做),您要求它同时执行10000个操作。
这是如何工作的呢?它必须执行其中一个请求,保存上下文,堆栈,刷新所有缓存,切换到下一个请求,执行那个请求……
2秒内500个请求相当于每个请求4毫秒。听起来没那么糟,不是吗?
另外,你有没有打开你的GC (在服务器和客户端)?如果请求以突发方式处理,然后是长时间的停顿,这可能是完全GC开始工作的迹象
https://stackoverflow.com/questions/37626924
复制相似问题