目录:
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. How Religion Destroys Programmers--ref

    http://simpleprogrammer.com/2013/07/08/how-religion-destroys-programmers/ discovered something about ...

  2. [转]浅谈 .NET Framework 与 .NET Core 的区别与联系

    本文转自:http://www.cnblogs.com/huchaoheng/p/6295688.html 2017到了,咱们学点啥啊,要想知道学点啥,先弄清.NET Framework 与 .NET ...

  3. 第一行代码 10.2使用HTTP协议访问网络 HttpURLConnection代码中的问题

    实现HttpURLConnection代码的时候,遇到了问题. 怎样点击途中Send Request按钮,没有任何改变. 最后将MainActivity中的一段代码URL url = new URL( ...

  4. new date()标准时间转yyyy-mm-dd hh:mm 24小时制

    <!DOCTYPE html> <html> <head> <title>new date()标准时间转yyyy-mm-dd hh:mm 24小时制&l ...

  5. PAT 1082. Read Number in Chinese

    #include <cstdio> #include <cstdlib> #include <string> #include <vector> #in ...

  6. 排序算法Nb三人组-快速排序

    核心思想: 将列表中第一个元素拿出来,放到一边,左右两个循环,左面的大于拿出来的数,就把他挪到右面, 右面的小于拿出来的数就把他放在左面,这是列表被第一个元素''分''为两个列表,在对两个列表进行同样 ...

  7. HDD 机械硬盘 安装 linux(centos7)

    1. 下载 UltraISO 文件-->打开, 选中centos.iso镜像;   启动-->写入硬盘映像-->硬盘驱动器(选中u盘)写入方式(USB-HDD+v2)-->写入 ...

  8. 日常捕获的野生知识 - javascript获取屏幕大小

    刚刚接触JavaScript,涉及到 document , window 的一些基本知识不是很了解,今天为了一个屏幕大小折腾了半天,幸好找到了很好的例子学习. 代码如下: <html> & ...

  9. 项目经验:GIS<MapWinGIS>建模第六天

    针对管网的暴管发生情况的,关阀分析,能够更快,更及时给施工作人员找到最近需要关停的阀门点,及受影响的管网段,如在这个区域内,还能找到受影响需要停水的用户

  10. 完整SQL分页存储过程(支持多表联接)

    http://www.cnblogs.com/andiki/archive/2009/03/24/1420289.html Code/********************************* ...