加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

Linux RPC调用很慢

发布时间:2020-12-13 23:28:00 所属栏目:Linux 来源:网络整理
导读:以下RPC程序在Fedora上执行速度非常慢. 如果我在llist.x中将名称缓冲区的大小从999个字符更改为512,那么它的工作速度很快. 我不知道为什么. 如果有人知道原因,请告诉我! 注意:请编译以下程序并执行服务器然后执行客户端. (对我来说,30个循环需要3秒钟.) ll
以下RPC程序在Fedora上执行速度非常慢.
如果我在llist.x中将名称缓冲区的大小从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

解决方法

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读