目录:
PowerDNS简单教程(4):优化篇(本篇)
 
最后一篇,介绍一下PowerDNS的性能优化。其实,这才是我的终极目的。简单的说,就是把QPS调到尽可能高。QPS,也就是每秒钟接收请求的数量,这是服务器抗压能力的一项很重要的指标。我的初步想法是让QPS达到50000+(其实这是领导给的要求)。第一眼看到这个数字说实话我的内心是有点崩溃的,因为这个数字看上去有点大,而我也不知道一个服务器到底承载能力有多强,不过同事说刚装好的pdns已经可以达到30000+,而在某某公司这个数值是位数的,于是我稍稍安心了点。
不过这里还有另一个问题:QPS的数值要怎么测呢?在同事的帮助下我找到一个工具,是BIND下自带的一个开源的专门测试DNS性能的小工具,叫做queryperf。安装起来比较简单,下载一个bind,进入bind目录下的contrib/queryperf目录中:
ls    # 看看这里都有什么
sudo ./configure
sudo make
ls
可以看到变出来一个名叫queryperf的文件(可执行文件)。没错就是这样神奇,快快快给个崇拜的眼神 ~咳咳,回来回来,这个queryperf文件就是我们要的东西,其他的都没有什么用了。
有工具了,还需要一个测试文件,内容是“域名+空格+类型”这样格式的记录。我写了一个脚本来生成,脚本大概是酱婶滴:
这样就生成了50万条记录。之后开始测试。
./queryperf -d (你的测试文件) -s (你的DNS服务器地址,默认localhost) -p (DNS服务器端口,默认53)
常用命令可以使用-h查看。
测试的结果应该是酱婶滴(这是第一次达到5万QPS的截图留念,后来又高了不少了):
如果不是的话,查一查是不是脚本写的有问题,还有地址、端口、数据库等等配置是否正常,可以用monitor模式启动pdns然后盯着看一看查询过程。
看到结果其实查询原理就简单了,N条记录,M秒查询出结果,相除一下就是QPS了。
 
好了热身活动结束,下面开始正式优化的过程(上面的测试结果是我已经优化过一部分了):
优化的思路主要有这么几个方面:PowerDNS设置;MySQL优化;Linux优化。
(1)PowerDNS方面:
可参考官网的优化方案:https://doc.powerdns.com/md/authoritative/performance/。要设置的内容都在pdns.conf配置文件中。
①缓存。在DNS服务器运行的过程中,可以dump查看一下相关参数,例如缓存碰撞的结果,如果miss较多,说明应该调大缓存的生存时间。在pdns.conf中控制缓存生存时间的主要有4个变量:cache-ttl,negquery-cache-ttl,query-cache-ttl,recursive-cache-ttl,默认的时间都不太一样,全部改成60。
②线程。PowerDNS有两个地方用到了线程,分别是receiver-threads和distributor-threads,官方解释是接收线程和分发线程。但是这两个线程并不是越多越好的。一是因为mysql的最大连接数有限,如果开多了线程,在monitor中可以看到,根本就没有连接到mysql;而是因为线程数过多的话,CPU要一直进行上下文切换,时间浪费过多。官网介绍说,distributor-threads是越小越好的,设置为1的时候会达到最优;而receiver-threads我经过实际测试,设置为12的时候QPS达到了最优。这个并没有什么科学的解释推理,只是经多方尝试后得到的结果。个人感觉,这个跟CPU核心数是有关的,只是没其他机器可以做实验了。
③日志。PowerDNS在查询过程中有日志记录,这个是会浪费一定的时间的。可以把记录日志相关的参数关掉。log-dns-details和log-failed-updates关掉实际测试并没有什么卵用,但是无意中发现query-logging关掉会有显著提高。(所谓“关掉”并不是把这个参数注释掉,而是让参数值为no)
官网中还介绍了pdns_control中看到的参数代表的含义:https://doc.powerdns.com/md/authoritative/performance/。同时也介绍了pdns.conf中的每个参数的含义:https://doc.powerdns.com/md/authoritative/settings/ 。我看到的有意义的也就上面介绍的这几个了。
(2)MySQL:
MySQL优化百度上能找到很多,我看了一部分介绍,根据其中的几个优化了一下MySQL。优化方法是进入用root进入mysql
show variables; 可以看到当前的所有变量(这是主要修改的地方)
show status; 可以看到当前的状态(根据状态来修改)
set xxx=yyy;可以修改变量(xxx是变量名,yyy是变量值)
如果不让改,那就到/etc/mysql/my.cnf配置文件中改,之后sudo service mysql restart重启数据库服务。
优化后并没有看到明显的效果。我猜想MySQL还没有达到瓶颈,所以优化起来对QPS提高目前还没有太多帮助。
(3)Linux:
Linux参数会影响到MySQL的一些性能。既然MySQL么有达到瓶颈,那么优化Linux意义也不是太大。
最终,按我司服务器的优化结果,本机QPS达到了84000+。
 
以上。在实际测试QPS的过程中,需要关注系统硬件的相关信息,我使用的是vmstat,需要用的同学请自行百度。上下文切换的瓶颈就是通过这个工具看出来的。现在达到了CPU瓶颈,我还不知道怎么解决。另外,猜想pdns连接backend的过程还是有地方可以优化的,这是需要pdns和MySQL配合完成的地方。继续优化。
vmstat使用方法可以看我之前发过的博客:http://www.cnblogs.com/anpengapple/p/5197530.html 没错,当时就是为了做PowerDNS优化才找的。
 
******************************即将结束的分隔线******************************
PowerDNS就介绍到这里了,不是很深,原因是:一是DNS的知识我也懂的不多,二是把PowerDNS搭建起来用起来这些足够了,三是PowerDNS的中文资料很少,官方英文资料我啃起来也是头疼(好吧这才是主要原因)。网上的中文博客基本也就是教了教怎么安装PowerDNS和Poweradmin,并没有涉及到功能及优化方面,而且CentOS居多,Ubuntu的博客甚少。不知道是不是因为玩PowerDNS的都是牛人,没有遇到什么问题,因此觉得没有什么好记录的。写这几篇一是为了备忘,同时也是为了将来有类似我这样的菜鸟可以拿来用用。秉承着一个理念:予人玫瑰,手留鱼香,肉丝。但愿真的有用吧。

PowerDNS简单教程(4):优化篇的更多相关文章

  1. PowerDNS简单教程(2):功能篇

    目录: PowerDNS简单教程(1):安装篇 http://www.cnblogs.com/anpengapple/p/5205130.html PowerDNS简单教程(2):功能篇(本篇) Po ...

  2. PowerDNS简单教程(1):安装篇

    这一篇开始直接是PowerDNS教程,连续四篇.DNS的相关背景知识我就不介绍了,有需要的话看看 http://baike.baidu.com/link?url=QcthFpAb2QydMqcMJr9 ...

  3. PowerDNS简单教程(3):管理篇

    目录: PowerDNS简单教程(1):安装篇 http://www.cnblogs.com/anpengapple/p/5205130.html PowerDNS简单教程(2):功能篇 http:/ ...

  4. 史上最简单的SpringCloud教程 | 第三篇: 服务消费者(Feign)

    转载请标明出处: https://www.fangzhipeng.com/springcloud/2017/07/12/sc03-feign/ 本文出自方志朋的博客 最新Finchley版本请访问: ...

  5. Spring+SpringMVC+MyBatis+easyUI整合优化篇(五)结合MockMvc进行服务端的单元测试

    日常啰嗦 承接前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例>,已经讲解了dao层和service层的单元测试,还有控制器这层也不能 ...

  6. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十四)谈谈写博客的原因和项目优化

    阶段总结 又到了优化篇的收尾阶段了,这其实是一篇阶段总结性的文章,今天是4月29号,距离第一次发布博客已经两个月零5天,这两个多月的时间,完成了第一个项目ssm-demo的更新,过程中也写了33篇博客 ...

  7. MySQL优化篇(一),我可以和面试官多聊几句吗?——SQL优化流程与优化数据库对象

    我可以和面试官多聊几句吗?只是想偷点技能过来.MySQL优化篇(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. MyISAM表锁和InnoD ...

  8. MySQL优化篇系列文章(二)——MyISAM表锁与InnoDB锁问题

    我可以和面试官多聊几句吗?只是想... MySQL优化篇系列文章(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. 面试官:咦,小伙子,又来啦 ...

  9. Netty实现高性能RPC服务器优化篇之消息序列化

    在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...

随机推荐

  1. golang基础---Slice切片

    切片Slice在go语言中是单独的类型(指向底层的数组),不同于python(对可迭代对象操作的工具),注意区分数组和slice的区别 定义一个空slice,格式var s []int,这种既没有长度 ...

  2. 我该不该学习C语言

    这几天把c语言过了一遍,基本上算是入门了,常用语法.函数的使用.c语言是比较古老的语言了,很多系统的底层.工业控制软件都是使用C语言编写,过一遍之后觉得c语言屹立不倒是有原因.c程序员有一句话:使用c ...

  3. Golang教程:类型

    下面是 Go 支持的基本类型: bool Numeric Types  int8, int16, int32, int64, int uint8,uint16,uin32,uint64, uint f ...

  4. Expression Blend实例中文教程(8) - 动画设计快速入门StoryBoard

    上一篇,介绍了Silverlight动画设计基础知识,Silverlight动画是基于时间线的,对于动画的实现,其实也就是对对象属性的修改过程. 而Silverlight动画分类两种类型,From/T ...

  5. .Net程序员玩转Android系列之三~快速上手

    快速环境搭建和Hello World 第一步:JAVA SDK(JDK)的安装: 官方下载地址: http://www.oracle.com/technetwork/java/javase/downl ...

  6. 在 Azure 上创建和链接 Azure SQL 数据库

    本快速入门介绍了如何在 Azure 门户中创建并连接 Azure SQL 数据库.在本教程中完成的所有操作均符合 1 元试用条件. 开始之前 如果您还没有 Azure 账户,可以申请 1 元试用账户. ...

  7. 使用SSH连接LINUX的命令

    查看端口号是否被占用 netstat -tunlp|grep 端口号 杀掉 kill-9 pid 后台运行 nohup 应用程序名 & disown -a && exit 屏幕 ...

  8. Hibernate 注解 (Annotations 三)多对一双向注解

    注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来 ...

  9. java IO流实现删除文件夹以及文件夹中的内容

    这篇主要是对IO文件流对文件常用处理中的删除文件夹,平时我们直接删除文件夹既可以删除里面的全部内容. 但是java在实现删除时,只能是文件才会被删除. 所以这里需要定义一个方法,来递归调用方法(递归调 ...

  10. 盒模型的属性丶display显示丶浮动

    一丶盒模型的属性(重要) 1.padding padding是标准文档流,父子之间调整位置 <!DOCTYPE html> <html> <head> <me ...