72 lines
2.5 KiB
ReStructuredText
72 lines
2.5 KiB
ReStructuredText
.. _module-pw_rpc-benchmark:
|
|
|
|
===================
|
|
pw_rpc Benchmarking
|
|
===================
|
|
pw_rpc provides tools for stress testing and benchmarking a Pigweed RPC
|
|
deployment and the transport it is running over. Two components are included:
|
|
|
|
* The pw.rpc.Benchmark service and its implementation.
|
|
* A Python module that runs tests using the Benchmark service.
|
|
|
|
------------------------
|
|
pw.rpc.Benchmark service
|
|
------------------------
|
|
The Benchmark service provides a low-level RPC service for sending data between
|
|
the client and server. The service is defined in ``pw_rpc/benchmark.proto``.
|
|
|
|
A raw RPC implementation of the benchmark service is provided. This
|
|
implementation is suitable for use in any system with pw_rpc. To access this
|
|
service, add a dependency on ``"$dir_pw_rpc:benchmark"`` in GN or
|
|
``pw_rpc.benchmark`` in CMake. Then, include the service
|
|
(``#include "pw_rpc/benchmark.h"``), instantiate it, and register it with your
|
|
RPC server, like any other RPC service.
|
|
|
|
The Benchmark service was designed with the Python-based benchmarking tools in
|
|
mind, but it may be used directly to test basic RPC functionality. The service
|
|
is well suited for use in automated integration tests or in an interactive
|
|
console.
|
|
|
|
Benchmark service
|
|
==================
|
|
.. literalinclude:: benchmark.proto
|
|
:language: protobuf
|
|
:lines: 14-
|
|
|
|
Example
|
|
=======
|
|
.. code-block:: c++
|
|
|
|
#include "pw_rpc/benchmark.h"
|
|
#include "pw_rpc/server.h"
|
|
|
|
constexpr pw::rpc::Channel kChannels[] = { /* ... */ };
|
|
static pw::rpc::Server server(kChannels);
|
|
|
|
static pw::rpc::BenchmarkService benchmark_service;
|
|
|
|
void RegisterServices() {
|
|
server.RegisterService(benchmark_service);
|
|
}
|
|
|
|
Stress Test
|
|
===========
|
|
.. attention::
|
|
This section is experimental and liable to change.
|
|
|
|
The Benchmark service is also used as part of a stress test of the ``pw_rpc``
|
|
module. This stress test is implemented as an unguided fuzzer that uses
|
|
multiple worker threads to perform generated sequences of actions using RPC
|
|
``Call`` objects. The test is included as an integration test, and can found and
|
|
be run locally using GN:
|
|
|
|
.. code-block:: bash
|
|
|
|
$ gn desc out //:integration_tests deps | grep fuzz
|
|
//pw_rpc/fuzz:cpp_client_server_fuzz_test(//targets/host/pigweed_internal:pw_strict_host_clang_debug)
|
|
|
|
$ gn outputs out '//pw_rpc/fuzz:cpp_client_server_fuzz_test(//targets/host/pigweed_internal:pw_strict_host_clang_debug)'
|
|
pw_strict_host_clang_debug/gen/pw_rpc/fuzz/cpp_client_server_fuzz_test.pw_pystamp
|
|
|
|
$ ninja -C out pw_strict_host_clang_debug/gen/pw_rpc/fuzz/cpp_client_server_fuzz_test.pw_pystamp
|