分布式系统中的轻量级远程过程调用
轻量级远程过程调用是一种为微内核操作系统中的跨域通信而设计和优化的通信工具。为了获得比传统 RPC 系统更好的性能,LRPC 使用以下四种技术:简单控制传输、简单数据传输、简单存根和并发设计。
在本文中,我们将详细介绍分布式系统中的轻量级远程过程调用 (RPC) 的概念。
轻量级 RPC 是一种 RPC,其中调用者和被调用进程都在同一台计算机上运行。在分布式系统中,有两种类型的通信:
- 消息传递:在这种类型的通信中,进程通过网络在异构平台上传递消息进行通信。因此,它处理跨机器流量。
- 共享内存:在这种类型中,内存不能物理共享,而是分布式共享内存,允许最终用户进程访问共享数据,而无需使用进程间通信。因此,它处理跨域(同一台机器上的域)流量。
如果两个进程都使用共享内存位置并驻留在同一台机器上,您可能希望避免使用 RPC 系统。因此,以这种方式进行优化,可以将消息构建为缓冲区,然后简单地写入共享内存区域。
当客户端和服务器都在同一台机器上执行并且您在同一台机器上的两个组件之间进行 RPC 调用时,以下注意事项可以帮助它优于标准 RPC 方法。
- 在这种情况下不需要编组。
- 我们可以消除显式消息传递的需要。相反,记忆被用作一种交流方式。
- 存根可以利用运行时标志来确定是否应该使用 TCP/IP 或共享内存。
- 不必使用外部数据表示 (XDR)。
LRPC 执行步骤:
- 调用者进程的参数被推到栈顶。
- 一个陷阱被发送到内核。
- 当陷阱被发送到内核时,它要么创建一个显式共享内存区域并将参数放在那里,要么从堆栈中获取一个页面并将其转换为共享页面。
- 由客户端线程执行的程序(OS upcall),当工作完成时,线程陷入内核。
- 内核再次更新地址空间并将控制权转移给客户端。
LRPC 是一种安全透明的通信协议,可供微内核操作系统使用。为了节省 RPC 调用所产生的费用,它被用于小内核操作系统。
LRPC 采用以下策略来提高传统 RPC 系统的性能:
- 简单的控制转移
- 简单的数据传输
- 简单存根
- 并发设计
- 简单控制转移:在这种策略中,请求的过程由客户端在服务器域中运行。从客户端线程到 LRPC 的服务器线程的直接上下文切换需要一种称为切换调度的线程调度机制。通过以下方式,客户端在进行第一次调用之前绑定到服务器接口。客户端在调用服务器时提供参数堆栈及其执行线程,最终进入内核陷阱。现在,内核对调用者进行验证,然后生成调用联动,将客户端的线程直接发送到服务器域,触发服务器处理。调用过程完成后,控制和结果返回到客户端调用点。
- 简单数据传输:它是一种类似于过程调用的参数传递方法,但具有共享参数堆栈以避免重复数据复制。消息传递机制用于传递参数和结果。要求是跨域 RPC Argument 副本复制 4 倍数据:
- RPC 消息存根,
- 来自客户端的内核消息
- 从内核到服务器
- 堆叠服务器
- 由于 LRPC 使用了共享参数栈,这个操作在一定程度上减少了,因为共享是指客户端和服务器都可以访问。这意味着,在 LRPC 中,相同参数的复制只能进行一次,从客户端的堆栈到共享参数堆栈。由于数据移动在从一个域到另一个域的传输过程中减少了数据副本,因此成本也降低了。参数堆栈的成对分配允许 LRPC 在客户端和服务器之间提供安全路由。
- 简单存根:使用 LRPC 可以轻松生成高度优化的存根,因为采用了控制和数据传输机制。客户端的域有一个调用存根,而服务器的域在每个过程中都有一个入口存根。 LRPC 接口中的每个过程都遵循三层通信协议:
- 从头到尾,由调用约定定义
- 由存根实现,存根到存根
- 内核实现的域到域通信
- LRPC 存根使协议层之间的边界变得模糊,从而可以降低跨层交叉的成本。唯一的要求是一个简单的 LRPC 是对客户端存根的一次正式过程调用和一次从服务器过程和客户端存根的返回。
- 并发设计:为了获得高调用吞吐量和低调用延迟,在具有共享内存和多处理器的 LRPC 中采用了特殊方法。通过消除不必要的锁争用和最小化共享数据结构的利用率来提高实际效率,同时通过降低上下文切换的开销来降低延迟。它导致更好的吞吐量。通过使用 LRPC 可以将性能提高三倍,并且还降低了跨域通信的成本。