- 内容提要
- 前言
- 作者简介
- 封面简介
- 第1章 理解高性能 Python
- 第2章 通过性能分析找到瓶颈
- 2.1 高效地分析性能
- 2.2 Julia 集合的介绍
- 2.3 计算完整的 Julia 集合
- 2.4 计时的简单方法——打印和修饰
- 2.5 用 UNIX 的 time 命令进行简单的计时
- 2.6 使用 cProfile 模块
- 2.7 用 runsnakerun 对 cProfile 的输出进行可视化
- 2.8 用 line_profiler 进行逐行分析
- 2.9 用 memory_profiler 诊断内存的用量
- 2.10 用 heapy 调查堆上的对象
- 2.11 用 dowser 实时画出变量的实例
- 2.12 用 dis 模块检查 CPython 字节码
- 2.13 在优化期间进行单元测试保持代码的正确性
- 2.14 确保性能分析成功的策略
- 2.15 小结
- 第3章 列表和元组
- 第4章 字典和集合
- 第5章 迭代器和生成器
- 第6章 矩阵和矢量计算
- 第7章 编译成 C
- 第8章 并发
- 第9章 multiprocessing 模块
- 第10章 集群和工作队列
- 第11章 使用更少的 RAM
- 第12章 现场教训
10.4 怎样启动一个集群化的解决方案
启动一个集群化系统的最简单的方式就是从一台既运行作业服务器又运行作业处理器(和CPU是一对一的关系)的机器开始。如果你的任务是CPU密集型的,每一个CPU跑一个作业处理器;如果你的任务是I/O密集型的,每一个CPU跑几个作业处理器。如果你的任务是RAM密集型的,请小心不要耗尽RAM。让你的单机解决方案在一个处理器上工作正常,接着再增加更多。让你的代码以不可预料的方式失效(例如,在你代码中做1/0,对你的工作者使用kill -9 <pid>,从插座上拔掉电源,这样让整个机器挂掉)来检查你的系统是否健壮。
显然,你想要做比这更重量级的测试—— 一个充满了编码错误和人工异常的单元测试集就好。Ian喜欢抛出非预期的事件,就像让一个处理器运行一个作业集,而一个外部进程正系统化地杀掉重要的进程并且通过任何你所使用的监控进程来确认所有这些进程都干净地重启了。
一旦你有了一个运行的作业处理器,就增加第二个。要检查你没有使用太多的RAM。你是否以从前两倍的速度来处理任务?
现在引入了第二台机器,仅仅只有一个作业处理器跑在新机器上,在协作机器上没有作业处理器。它处理作业的速度是否与协作机器有处理器时一样快?如果不是,为什么?是延迟的问题吗?你做了不同的配置吗?也许你有不同的机器硬件,类似于CPUs、RAM和缓存大小?
现在加入另外9台计算机来测试看看你是否以比从前快10倍的速度来处理任务。如果不是,那么为什么呢?是否发生了网络冲突减慢了你的整体处理速率?
当机器启动时,为了可靠地启动集群组件,我们倾向于使用cron任务,Circus或supervisord,或者有时使用Upstart(正在被systemd所代替)。Circus比supervisord更新,但两者都是基于Python的。cron陈旧,但是如果你只是启动一个类似于能启动所需子进程的监控进程那样的脚本的话,它是非常可靠的。
一旦你有了一个可靠的集群,你可能就想要引入一个类似Netflix的ChaosMonkey那样的随机杀手工具来故意杀掉你的部分系统来测试它们的弹性。你的进程和硬件最终会挂掉,但你不需要在经历痛苦之后才知道,你至少可以在遭受你所预料会发生的错误中存活下来。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论