我有一个可以在我的数据库上运行的后端进程。这是在一台单独的计算机上使用,这样前端就能创造奇迹(至少在速度方面)。该后端进程创建一个UDP服务器并在其上侦听数据包。
在前端计算机上,我从服务器创建子进程。每个孩子都可以在数据库中创建需要后端做更多工作的数据。为了让后端知道,我使用UDP客户端连接发送PING。
Front End / Backend Setup Processing
+-------+ +---------+ +----------+
| | | | | Internet |
| Front | PING | Backend | | Client |
| End |-------->| | +----------+
| | | | HTTP Request |
+-------+ +---------+ v
^ ^ +----------+
| | | FrontEnd |--------+
| | +----------+ PING |
v v HTTP Response | v
+---------------------------+ v +---------+
| | +----------+ | Backend |
| Cassandra Database | | Internet | +---------+
| | | Client |
+---------------------------+ +----------+
如果没有PING,后端将结束其工作并入睡,直到下一个PING将其唤醒。虽然存在故障保护,但我将超时时间设为5分钟,因此无论如何,后端都会偶尔唤醒。
我的问题是关于UDP堆栈,我知道它是一个FIFO,但我想知道两个参数:
在FIFO充满之前,我可以收到多少PING?
如果我不能尽快阅读,我可能会收到PING并丢失吗?
这些问题的答案可以帮助我调整后端服务器的当前等待循环。到目前为止,我假设FIFO有一个限制,我可能会丢失一些数据包,但我没有实现允许数据包消失的方法(即有人发送PING,但后端需要太长时间再次检查UDP堆栈因此,网络决定数据包现在已超时,并将其从我的脚下移除。)
更新:我添加了一个简单的处理来显示当(从上到下的时间)时会发生什么
答案 0 :(得分:1)
您可以使用sysctl在系统上设置默认缓冲区大小,或使用带有SO_RCVBUF选项的setsockopt为每个套接字设置它。
int n = 512 * 1024; // 512K
if (setsockopt(my_socket, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n)) == -1) {
perror("Failed to set buffer size, using default");
}
系统上还有一个您无法检查的最大设置。在我的机器上,默认接收缓冲区大小为208K,最大值为4M:
# sysctl net.core.rmem_max
net.core.rmem_max = 4194304
# sysctl net.core.rmem_default
net.core.rmem_default = 212992
答案 1 :(得分:1)
在FIFO充满之前,我可以收到多少PING?
这取决于套接字接收缓冲区的大小。
如果我不能尽快阅读,我可能会收到PING并丢失它吗?
是和否。已经接收到并且适合套接字接收缓冲区的数据报保持不变,直到它们被读取或套接字关闭为止。您可以在限制范围内调整套接字接收缓冲区的大小。但是,当套接字接收缓冲区已满时到达的数据报将被丢弃。