为什么我的Thraded Thrift调用很慢?

时间:2015-11-09 08:18:49

标签: c++ thrift

我的节俭定义是这样的:

list<i32> getValues()

在C ++中实现它。

Server.cpp包含以下代码:

.....

std::vector<int32_t> store;

  TransferServiceHandler() {
    for(int i=0;i<100000000;i++)
      store.push_back(i);
  }

  void getValues(std::vector<int32_t> & _return) {
    // Your implementation goes here

    _return = store;

  }

.....

Client.cpp有一个简单的循环,它调用getValues():

for(int k=0;k<10;k++){

  clock_gettime(CLOCK_REALTIME, &ds_spec);
  int64_t dstarted = ds_spec.tv_sec * 1000 + (ds_spec.tv_nsec / 1.0e6);

  std::vector<int32_t> values;
  client.getValues(values);


  clock_gettime(CLOCK_REALTIME, &de_spec);
  int64_t dended = de_spec.tv_sec * 1000 + (de_spec.tv_nsec / 1.0e6);

  std::cout << "Values size :" << values.size() << " in " << (dended - dstarted) << " ms\n";

}

在循环外初始化和关闭连接。

此调用通常会返回数十万个条目。

当没有数据时(当列表为空时)我可以看到呼叫在1ms-2ms内发生,当我改变数据时,传输的延迟是不可预测的。客户端和服务器都在同一台机器上运行(配备10Gb / s以太网,8核和30 GB内存)。

你通常如何调试这样的情况?我不认为这个问题与网络有关,因为它的10 Gigs机器和数据大小几乎没有MB。

enter image description here

我运行了各种数据大小的基准测试,您可以看到每次调用的延迟都不稳定。

3 个答案:

答案 0 :(得分:3)

我不确定我是否完全理解客户端和服务器之间的交互,但是使用移动语义(C ++ 11)可以改进getValue方法,因此可以移动store向量而不是制作副本(内存操作非常昂贵)如下:

  void getValues(std::vector<int32_t> & _return) {
    // Your implementation goes here
    _return = std::move(store);
  }

请注意,只要store(现在已移至_return)的内容不需要超出getValue的调用范围,就可以正常工作。

答案 1 :(得分:0)

在我看来,你在这里失去了解决方案:

clock_gettime(CLOCK_REALTIME, &ds_spec);
  int64_t dstarted = ds_spec.tv_sec * 1000 + (ds_spec.tv_nsec / 1.0e6);

这与使用clock_gettime()开头的原因背道而驰; Here是关于如何使用clock_gettime()分析代码的链接;希望它能解决你的问题。

我指的是解决方案,因为这可能是意外分析结果的一个很好的原因。

答案 2 :(得分:0)

在将数据作为二进制而不是向量传输后,我的性能得到了显着改善。

在thrift定义文件中,将列表更改为二进制。

以下是相同数据量的新基准:

enter image description here