Squid Web Cache Wiki

Squid Web Cache 文档

🔗 缓存管理器 API

:warning: 此页面仍在开发中。它反映了 FrancescoChemolli 在尝试实现新的 cachemgr 框架时所做的发现。它可能包含不准确的信息。

本文档详细介绍了如何为 Squid 3.2+ 实现多 CPU 缓存管理器操作,遵循 AlexRousskov 实现的 API 框架。

🔗 概述

为了在多 CPU 系统中正确累积信息,需要一个框架来跨实例累积信息,以便以汇总的形式显示给用户。

为此,需要使用几个关键类

🔗 缓存管理器操作数据

这是需要在实例之间通过 IPC 机制传递以累积数据的各类信息。其基本签名是

    class MyModuleMgrActionData
    {
      MyModuleMgrActionData();
      MyModuleMgrActionData& operator += (const MyModuleMgrActionData&)
    
      type1 datamember1;
      type2 datamember2;
      //.. etc
    };

虽然此签名并非严格强制 - 因为它主要由耦合的 CacheManagerAction 类使用,但为了保持一致性,建议使用它。

🔗 缓存管理器操作

这是当缓存管理器框架收到用户的一些操作请求时激活的模块。其基本签名是

    #include "mgr/Action.h"
    class MyModuleMgrAction : public Mgr::Action
    {
    protected:
        MyModuleMgrAction(const Mgr::CommandPointer &cmd);
        virtual void collect();
        virtual void dump(StoreEntry* entry);
    
    public:
        static Pointer Create(const Mgr::CommandPointer &); // factorty method
        virtual void add(const Mgr::Action&);
        virtual void pack(Ipc::TypedMsgHdr&) const;
        virtual void unpack(const Ipc::TypedMsgHdr&);
    
    private:
        MyModuleMgrActionData data;
    };

其中 PointerMgr::Action 中定义为指向操作的引用计数指针;同样,CommandPointer 是指向命令的引用计数指针。

数据成员用于在 Squid 实例之间累积数据。执行流程是

  1. 一个实例收到 cachemgr 请求;它通过其静态 Create 函数实例化一个 MyModuleMgrAction
  2. (不详细说明)此 Action 的 run() 方法调用每个工作进程的 collect() 方法
  3. collect() 应该用任何相关数据填充 MyModuleMgrAction 的数据成员
  4. 数据通过 pack()unpack() 重新打包回协调器进程
  5. 协调器进程使用 Action 的 add() 方法将来自所有工作进程的信息合并进来。Action 参数实际上是 MyModuleMgrAction 的多态引用,可以安全地动态转换为正确的类型
  6. 一旦数据累积完毕,就会调用 dump() 方法来打印信息。

pack()unpack() 可以依赖 IPC 库提供的通用基础设施,因此它们通常看起来像这样

    void
    MyModuleMgrAction::pack(Ipc::TypedMsgHdr& msg) const
    {
        msg.setType(Ipc::mtCacheMgrResponse);
        msg.putPod(data);
    }
    
    void
    MyModuleMgrAction::unpack(const Ipc::TypedMsgHdr& msg)
    {
        msg.checkType(Ipc::mtCacheMgrResponse);
        msg.getPod(data);
    }

🔗 注册

XXX 待办

导航:网站搜索网站页面分类🔼 向上