  Remote Procedure Call (RPC) is a widely used abstraction for cloud computing.
The programmer specifies type information for each remote procedure, and a
compiler generates stub code linked into each application to marshal and
unmarshal arguments into message buffers. Increasingly, however, application
and service operations teams need a high degree of visibility and control over
the flow of RPCs between services, leading many installations to use sidecars
or service mesh proxies for manageability and policy flexibility. These
sidecars typically involve inspection and modification of RPC data that the
stub compiler had just carefully assembled, adding needless overhead. Further,
upgrading diverse application RPC stubs to use advanced hardware capabilities
such as RDMA or DPDK is a long and involved process, and often incompatible
with sidecar policy control.
  In this paper, we propose, implement, and evaluate a novel approach, where
RPC marshalling and policy enforcement are done as a system service rather than
as a library linked into each application. Applications specify type
information to the RPC system as before, while the RPC service executes policy
engines and arbitrates resource use, and then marshals data customized to the
underlying network hardware capabilities. Our system, mRPC, also supports live
upgrades so that both policy and marshalling code can be updated transparently
to application code. Compared with using a sidecar, mRPC speeds up a standard
microservice benchmark, DeathStarBench, by up to 2.5$\times$ while having a
higher level of policy flexibility and availability.
