2016-06-04 11 views
0

У меня есть простой надувать сервер бережливость:надувать Нет асинхронный не выполняет

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) 
    } 

} 

Этот сервер работает, но у меня есть одна большая проблема: я написал бережливость nodejs клиента с цикл. Он выполняет 10.000 бережливого запроса. Но это не асинхронно. Он выполняет 500 запросов и остановок. Через некоторое время, 2 или 3 секунды, будет выполнено еще 300 запросов. Теперь вопрос: зачем это происходит? Что-то не так с моим сервером или клиентом? Я использую только созданный apache сведенный 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); 
} 

ответ

0

Ваш var count несинхронизирован. Это очень большая проблема, но, вероятно, не связана с вашей проблемой производительности. Вы также блокируете поток finagle, что также является большой проблемой, но в вашем макетном случае это не имеет значения, потому что нет времени ожидания.

Подумайте об этом таким образом. Скажем, у вас есть один процессор (у вас, вероятно, несколько, но есть и другие вещи, идущие на машине), и вы просите его выполнить 10000 операций все в то же время.

Как это может работать? Он должен будет выполнить один из запросов, сохранить контекст, стек, очистить все кеши, переключиться на следующий запрос, выполнить этот ...

500 запросов за 2 секунды - 4 миллисекунды за запрос. Не звучит так плохо, не так ли?

Кроме того, вы превратили свой GC (как на сервере, так и на клиента)? Если запросы обрабатываются в очередях, за которыми следуют длительные паузы, это, вероятно, признак полного нокаута GC в

+0

Для меня: Звучит очень плохо. Я имею в виду, что kafka может обрабатывать 2 миллиона запросов в секунду тремя машинами. 500 запросов за 2 секунды звучат очень плохо. Но я проверю это. Есть ли у вас другие стратегии для обработки большего количества запросов? –

+0

Не знаю, где у вас есть 2-миллионное число. Официальная контрольная страница Kafka обещает 100 тыс. Сообщений: http://kafka.apache.org/07/performance.html. Также обратите внимание, что «в секунду» и «в то же время» не совсем то же самое, что «машина» не является очень точной спецификацией, что Kafka является io-bound, а ваши вещи - все-cpu .. – Dima

+1

Также, вы включили GC (как на сервере, так и на клиенте)? Если запросы обрабатываются в очередях, за которыми следуют длинные паузы, это, вероятно, признак полной загрузки GC. – Dima

 Смежные вопросы

  • Нет связанных вопросов^_^