【问题标题】:Linux RPC call is slowLinux RPC 调用很慢
【发布时间】:2016-04-24 18:41:57
【问题描述】:

以下 RPC 程序在 Fedora 上执行非常缓慢。 如果我在llist.x 中将name 缓冲区的大小从999 个字符更改为512 个字符,那么它的工作速度很快。 我不知道为什么。 如果有人知道原因,请告诉我!

注意:请编译以下程序并执行服务器然后客户端。 (对我来说,30 个循环需要 3 秒。

llist.c

#include "llist.h"
#define PRINT_TIME  (!gettimeofday(&tv, NULL) && printf(" %lf",tv.tv_sec+(tv.tv_usec/1000000.0)))

struct timeval tv;

int main(int argc, char *argv[])
{
CLIENT *cl;
int *result,i=0;

cl = clnt_create("localhost", PRINTER, PRINTER_V1, "tcp");
if (cl == NULL) {
            clnt_pcreateerror("Cant Create Client Handle");
    printf("error: could not connect to server.\n");
    return 1;
}

    ST1 key[1];
    ST1_stuff  key_x;

    /*key_x.ST1_stuff_val = key;
    key_x.ST1_stuff_len = 1;
*/
    while(i<30)
    {
            printf("\n %d -> start - ",i);
            PRINT_TIME;
            result = sei_conf_test_keys2_1(&key_x,cl);
            if (result == NULL) {
    printf("error: RPC failed!\n");
    return 1;
    }
            printf("\nresult = %d ",*result);
            i++;
            printf("\n end - ");
            PRINT_TIME;
            printf("\n -------------------------------------");
    }

    return 0;
}

llist_svc_proc.c

#include <stdlib.h>
#include "llist.h"

int result;

int *sei_conf_test_keys2_1_svc(ST1 *lst, struct svc_req *req)
{
   result = 0;
   return &result;
}

llist.x

 struct s1{
    char name[999];              /* <===== HERE */
 };
 typedef struct s1 ST1;

 typedef ST1 ST1_stuff[1];


 program PRINTER {
    version PRINTER_V1 {
            int SEI_CONF_TEST_KEYS2(ST1_stuff) = 10;
    } = 1;
 } = 0x2fffffff;

制作文件

.SUFFIXES:
.SUFFIXES: .c .o
CLNT = llist
SRVR = llist_svc
CFLAGS = -g -Wall

SRVR_OBJ = llist_svc_proc.o llist_xdr.o llist_svc.o
CLNT_OBJ = llist.o llist_xdr.o llist_clnt.o

.c.o:
        gcc -c -o $@ $(CFLAGS) $<

default: $(CLNT) $(SRVR)

$(CLNT): $(CLNT_OBJ) llist.h
        gcc -o $(CLNT) $(CLNT_OBJ)

$(SRVR): $(SRVR_OBJ) llist.h
        gcc -o $(SRVR) $(SRVR_OBJ)
clean:
        rm *.o $(CLNT) $(SRVR)
        rm -f llist_xdr.c llist.h llist_clnt.c llist_svc.c
        rm core

【问题讨论】:

  • 你应该在你的makefile中包含rpcgen命令
  • 我在 RHEL6.7 系统 1.19 secs0.03 secs 上看到了相同的时差
  • 另外rm -f core 将停止抱怨它不存在。
  • 我猜 sendz 和 recvsz 会在 999 自动做一些他们在 512 不会做的坏事。
  • 发布的问题包含llist.cllist_serv_proc.cllist.xmakefilellist.x 是什么? llist.h 在哪里?

标签: c linux rpc


【解决方案1】:

时间增加似乎与允许的最大值有关 一个 TCP 包中的数据。

使用网络分析器可以看到,大小为 999 的包有 167 个 而大小为 512 的情况下,客户端和服务器之间仅发送大约 79 个数据包。 每个包的最大数据大小似乎是 4000 字节。

如果您需要性能,请考虑切换到似乎不受最大包大小和额外开销限制的 UDP。

【讨论】:

  • 一个人不会简单地从 TCP 切换到 UDP 而不忽略后果。
  • @fsaintjacques 是的,当然,但至少对于本地主机上的流量,就像在 OP 的问题中一样,UDP 应该没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多