PowerDNS-导言

首先从外部功能的角度去说一下,这里都是参考它的文档

1.可以运行在一个保护模式下,同时也提供日志相关的

2。需要一个控制socket,来和pdns交互

 

 

 

PacketHandler类封装question到DNSBackend.,powerdns采用UeberBackend作为它的DNSBackend采用

这里介绍它整体的一个流程,下面的部分第一个是它的类,可以从最下面的main函数开始看,如果发现新的类可以在上面搜索

对于多CPU来说,以往的方法是,一个线程创建socket并且绑定socket,然后建立的多个线程去竞争该socket,这种竞争会导致性能的下降
但是powerdns的方式是,每个CPU核都会设置绑定自己的socket,内核会把数据均衡的负载到不同的线程去处理(每个线程会调用socket绑定相同的地址)(通过receiver-threads设置)

主进程加载配置文件,起码会创建一个udpserver,然后会创建receiver-threads个udpserver,然后进入到mainthread函数,该函数启动receiver-threads个线程,即进入qthread函数,该线程就是主要的逻辑

在每一个qthread线程中,都会实例化一个DNSDistributor对象(它的backend是packethandler这个对象就是专门负责解析dns包的,对于有延迟的后端来说,也可以开多个distributors来分发问题,即每一个qthread线程也可以对应多个distributors线程,通过distributor-threads指定,往往是1个线程的时候会快很多),对于单个distributors的话,它在实例化的时候就只是实例化一个packethandler对象,对于多个distributors的话,它在实例化的时候会创建distributor-threads个管道,distributor-threads个线程,每个线程运行makethread函数,该函数也是一个死循环,具体作用后面介绍

下面qthread线程就是进入死循环,udpserver去调用自己的receive函数接收网络包把它封装到dnspacket结构中(如果是多个udpserver的话,那就多个udpserver同时调用receive),在拿到网络包以后,也即question以后,先去cache中看有没有命中,如果命中的话直接返回结果,如果没有命中的话就去调用distributor的question方法进行数据包的分发,对于单个distributors的话,它直接调用packethandler的question方法进行question的查询,并且调用sendout函数直接响应结果,对于多个distributors的话,它的question方法和单个distributor的question方法不一样,它是封装question和sendout函数到QuestionData结构中,并且通过pipe发送到对应的makethread线程中,makethread线程的作用就是实例化packethandler对象,并且进入for死循环,从管道中读取拿到的question和sendout函数,然后调用packethandler的question方法去处理它,即查询该question,并且调用sendout函数发送查询结果,多个distributor起到的作用就是当包的个数超过一定限制后可以限制,并且它可以平均的分发到不同的线程中去,还有超时不处理的功能

下一部分就是它的代码部分,可以多次结合这个看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值