瓦尼什如何遇到切里2/N

Cheri的能力是指针的两倍,而且Varnish不仅在每个请求中使用大量指针,而且在RAM方面也很吝啬,因为使用100K工作线程并不少见。

许多测试用例失败是因为它们在内存分配上很吝啬,而其他测试用例则会用完缓存空间。

这些测试用例的工作是将Varnish推送到模糊的代码路径中,使用经过精细调整的对象大小、标头长度和参数设置进行Varnish,并使用Varnish中较大的指针来关闭。

这些测试失败与切里无关。

有足够的余量,我们可以找到在32位和64位CPU上都能工作的幻数,也就是4字节和8字节指针,但怀疑是否有足够的余量使它们也能在16字节指针上工作,所以我只在这里列出这些测试作为计算的一部分:

Workspace sizes
=====================
TEST tests/c00108.vtc
TEST tests/r01038.vtc
TEST tests/r01120.vtc
TEST tests/r02219.vtc
TEST tests/o00005.vtc

Cache sizes
=====================
TEST tests/r03502.vtc
TEST tests/r01140.vtc
TEST tests/r02831.vtc
TEST tests/v00064.vtc

切里治下不能做的事:管子里的指针

Varnish有一个中央的“服务员”服务,它的工作是监视空闲网络连接的文件描述符,并在数据到达网络连接时、如果数据到达或超时后关闭时执行正确的操作。

出于性能原因,我们有多个实现: kqueue(2) (BSD)、 epoll(2) (Linux)、 ports(2) (Solaris)和 poll(2) 它应该适用于所有阅读过POSIX的地方。

我们只有 poll(2) 基于可携带性的服务员,在新平台上部署时需要处理的问题减少了一个,其性能在当代开放网络连接的负载下降级为无用。

它们的工作方式都是在相关的系统调用中有一个线程,监控数以万计的文件描述符。

其中一些系统调用允许其他线程将FD添加到列表中,但是 poll(2) 没有,所以当我们启动投票服务员时,我们创建了一个 pipe(2) ,并让服务员也听一听。

当另一个线程想要向清单中添加文件描述符时,它使用 write(2) 将指针发送到该管道中。内核为我们提供了所有的锁定和缓冲,唤醒了读取指针的等待线程,将新的FD添加到它的清单中,并重新进入 poll(2)

这是100%安全的,因为没有其他人可以访问使用 pipe(2) ,但是Cheri没有办法发现这一点来进行执行,所以从文件描述器中读取指针会导致完全合理的核心转储。

如果轮询服务员确实是相关的,正确的解决方法是让发送线程将事情粘贴到锁定列表上,并只将一个随机数字节写入到等待线程的管道中,但这位于TODO列表的底部,目前我只从五个测试中删除了-Wpol参数,然后通过::

-Wpoll
=====================
TEST tests/b00009.vtc
TEST tests/b00048.vtc
TEST tests/b00054.vtc
TEST tests/b00059.vtc
TEST tests/c00080.vtc

但为什么要做五次测试呢?

它看起来像是一个测试售票员和四个复制粘贴的案例。

永远不要写你自己的红黑树

一般来说,我不敢涉足的代码片段很少,但有很多代码我不想接触,如果有任何方法可以避免的话。

红黑树就是其中之一。

在瓦尼什,我们进口了^H^H <queue.h><tree.h> ,但为了安全起见,我们使用了 V 在里面的所有东西上都加前缀。

我偶尔会运行一个小的Shell脚本来执行v-thing,并将结果与 vtree.hvqueue.h ,以跟上免费BSD的步伐。

今天,这样做得到了丰厚的回报:切里队的一些可怜的人不得不涉水进入 tree.h 和棍子 __no_subobject_bounds 指示让那个怪物在切里的领导下工作。

我只运行了我的脚本,又通过了20个测试:

Red-Black Trees
=====================
TEST tests/b00068.vtc
TEST tests/c00005.vtc
TEST tests/e00003.vtc
TEST tests/e00008.vtc
TEST tests/e00019.vtc
TEST tests/l00002.vtc
TEST tests/l00003.vtc
TEST tests/l00005.vtc
TEST tests/m00053.vtc
TEST tests/r01312.vtc
TEST tests/r01441.vtc
TEST tests/r02451.vtc
TEST tests/s00012.vtc
TEST tests/u00004.vtc
TEST tests/u00010.vtc
TEST tests/v00009.vtc
TEST tests/v00011.vtc
TEST tests/v00017.vtc
TEST tests/v00041.vtc
TEST tests/v00043.vtc

四次失败留下了…

/phk