Книга: UNIX: взаимодействие процессов

Программа определения полосы пропускания Sun RPC

Программа определения полосы пропускания Sun RPC

Поскольку вызовы процедур в Sun RPC являются синхронными, для них действует то же ограничение, что и для дверей (см. выше). В данном случае проще создать две программы (клиент и сервер), поскольку они создаются автоматически программой rpcgen. В листинге А.11 приведен файл спецификации RPC. Мы объявляем единственную процедуру, принимающую скрытые данные переменной длины в качестве входного аргумента и ничего не возвращающую.

В листинге А.12 приведен текст программы-клиента, а в листинге А.13 — процедура сервера. Мы указываем протокол в качестве аргумента командной строки при вызове клиента, что позволяет нам измерить скорость работы обоих протоколов.

Листинг А.11. Спецификация RPC для измерения полосы пропускания RPC

//bench/bw_sunrpc.х
1 %#define DEBUG /* сервер выполняется в приоритетном режиме */
2 struct data_in {
3  opaque data<>; /* скрытые данные переменной длины */
4 };
5 program BW_SUNRPC_PROG {
6  version BW_SUNRPC_VERS {
7   void BW_SUNRPC(data_in) = 1;
8  } = 1;
9 } = 0x31230001;

Листинг A.12. Клиент RPC для измерения полосы пропускания

//bench/bw_sunrpc_client.с
1  #include "unpipc.h"
2  #include "bw_sunrpc.h"
3  void *buf;
4  int totalnbytes, xfersize;
5  int
6  main(int argc, char **argv)
7  {
8   int i, nloop, ntowrite;
9   CLIENT *cl;
10  data_in in;
11  if (argc != 6)
12   err_quit("usage: bw_sunrpc_client <hostname> <#loops>"
13   " <#mbytes> <#bytes/write> <protocol>");
14  nloop = atoi(argv[2]);
15  totalnbytes = atoi(argv[3]) * 1024 * 1024;
16  xfersize = atoi(argv[4]);
17  buf = Valloc(xfersize);
18  Touch(buf, xfersize);
19  cl = Clnt_create(argv[1], BW_SUNRPC_PROG, BW_SUNRPC_VERS, argv[5]);
20  Start_time();
21  for (i = 0; i < nloop; i++) {
22   ntowrite = totalnbytes;
23   while (ntowrite > 0) {
24    in.data.data_len = xfersize;
25    in.data.data_val = buf;
26    if (bw_sunrpc_1(&in, cl) == NULL)
27     err_quit("%s", clnt_sperror(cl, argv[1]));
28    ntowrite –= xfersize;
29   }
30  }
31  printf("bandwidth: %.3f MB/secn",
32   totalnbytes / Stop_time() * nloop);
33  exit(0);
34 }

Листинг A.13. Процедура сервера для измерения полосы пропускания RPC

//bench/bw_sunrpc_server.c
1  #include "unpipc.h"
2  #include "bw_sunrpc.h"
3  #ifndef RPCGEN_ANSIC
4  #define bw_sunrpc_1_svc bw_sunrpc_1
5  #endif
6  void *
7  bw_sunrpc_1_svc(data_in *inp, struct svc_req *rqstp)
8  {
9   static int nbytes;
10  nbytes = inp->data.data_len;
11  return(&nbytes); /* должен быть ненулевым, но xdr_void игнорирует */
12 }

Оглавление книги


Генерация: 1.770. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз