豪翔天下

Change My World by Program

0%

额,这是最简单的备份方式,只需要把mysql的数据文件打包并压缩即可,要恢复的时候再把相应的文件拷过去覆盖就行了。

冷备份实际上是最简单的备份方式(好吧,第一次我就差点把数据库搞崩溃了),但由于要求停止MySQL服务来进行备份和恢复,并且只能完整备份,所以实用性并不高。

备份

首先,进入数据库并找出数据文件存放目录:

mysql> show variables like '\%dir\%';
+-----------------------------------------+----------------------------+
| Variable_name                           | Value                      |
+-----------------------------------------+----------------------------+
| basedir                                 | /usr                       |
| binlog_direct_non_transactional_updates | OFF                        |
| character_sets_dir                      | /usr/share/mysql/charsets/ |
| datadir                                 | /var/lib/mysql/            |
| innodb_data_home_dir                    |                            |
| innodb_log_group_home_dir               | ./                         |
| innodb_max_dirty_pages_pct              | 75                         |
| lc_messages_dir                         | /usr/share/mysql/          |
| plugin_dir                              | /usr/lib/mysql/plugin/     |
| slave_load_tmpdir                       | /tmp                       |
| tmpdir                                  | /tmp                       |
+-----------------------------------------+----------------------------+
11 rows in set (0.00 sec)

数据目录就是datadir的所在位置,即/var/lib/mysql/

然后执行:

cd /var/lib/                          # 进入其上级目录
service mysql stop                    # 关闭mysql服务,这里我其实并没有关闭,但我没有在高                                         数据量下测试过
tar jcvf ~/backup.tar.bz2 mysql/      # 打包压缩该目录到根目录

恢复

执行如下命令即可:

cd ~/                           # 进入备份文件的保存目录
tar jxvf backup.tar.bz2 mysql/  # 解压
gunzip -r mysql/                # 递归解压
service mysql stop              # 必须先关闭服务
rm -r /var/lib/mysql/           # 删除原目录
mv ~/mysql/ /var/lib/           # 把备份的文件移动到/var/lib/里面去替代原来的mysql
service mysql start             # 重启mysql服务

需要注意的是恢复过后,就和原来数据库一模一样了,包括所有的修改和帐号密码等信息。

参考:《MySQL管理之道》

简介

Sysbench是一个模块化、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。

安装

sudo apt-get install sysbench

参数列表

General options:

--num-threads=N          线程数,默认为1
--max-requests=N         并发请求限制,默认为10000
--max-time=N             最大执行时间,默认为0
--forced-shutdown=STRING 最大执行时间后多久强制关闭
--thread-stack-size=SIZE 每个线程的栈大小,默认32K
--init-rng=[on|off]      初始化随机数生成器,默认off
--test=STRING            test to run
--debug=[on|off]         打印更多的调试信息,默认off
--validate=[on|off]      尽可能执行验证检查,默认off
--help=[on|off]          查看帮助
--version=[on|off]       查看版本

Compiled-in tests:

fileio    磁盘I/O性能测试
cpu       CPU性能测试
memory    内存分配及传输速度测试
threads   POSIX线程性能测试
mutex     调度程序性能测试
oltp      数据库性能测试(OLTP基准测试)

使用举例

测试Mysql的InnoDB存储引擎,其中16个并发连接,最大请求1万个,表记录有9百万条:

sysbench --test=oltp -MySQL-table-engine=innodb \\
--oltp-table-size=9000000 \\
--max-requests=10000 \\
--num-threads=16 \\
--MySQL-host = 127.0.0.1 \\
--MySQL-port = 3306 \\
--MySQL-user = root \\
--MySQL-password = 123456 \\
--MySQL-db = test \\
--MySQL-socket=/tmp/MySQL.sock prepare

参考:http://www.oschina.net/question/17_4248

MySQL在5.5X开始,默认的存储引擎改为了InnoDB
Plugin引擎,而我正是在5.5开始使用MySQL的,对两个引擎的区别还不甚了解,所以特别查阅了大量的资料,整理如下:

有何区别:

最简单的,一条语句即可看到:

更具体的看下面:

Innodb

  • 索引聚集表,存储结构采用BTREE
  • 数据存储是有顺序的,默认以主键排序,主键就是数据本身,所以对于insert比较多的情况,最好建一个自增主键,以方便保持其顺序性

MyISAM

如何选择

我认为两个引擎没有孰优孰劣之分,具体怎么选择完全看业务需要。

InnoDB适合: 1.数据量巨大时,提高CPU效率,这一点上其他引擎都比不上InnoDB 2.使用事务 3.可靠性好、性能高 4.更新查询都相当频繁
5.表锁定几率较大 6.大量的主键查询 7.并发量大的update语句 8.高压力、高并发

MyISAM适合: 1.磁盘空间较小 2.大量count计算(MyISAM用一个值来记录,而InnoDB每次都扫描全表) 3.插入不频繁,查询频繁
4.不使用实务 5.大量的insert语句

作者:贺春旸

先介绍介绍作者,作者是51CTO技术博客之星,曾任职于中国移动飞信、国内某知名电商,致力于MySQL、Linux等开源技术的研究,现任职于机锋安卓市场,负责MySQL性能调优和架构设计。

其实这本书并不是讲什么非常前沿的技术,但是我看过很多的技术书籍以及网上的技术教程,大部分的技术都是上个世纪的,完全不能用,有些甚至连基本原理都改变了,但国内的书市几乎都被这种书填满了,直到这两年,随着开源社区的快速发展,微软、诺基亚的没落,人们(特别是国内的程序员)开始关注起最新的技术,开始向国外吸取精华,哪怕是看英文原版,也比等几年后出的中文翻译版要好。并且现在已经有大量的人涌入开源社区,义务进行翻译工作,如果GFVV不加阻挠,相信中国在计算机科学方面一定能快速成长到国际先进水平。

本书记述了作者多年以来在MySQL数据库维护上的一些见解以及处理问题的一些方法。当我拿到书本翻开目录的那一霎,顿时感觉买此书绝对值,因为作者完全是按照MySQL5.5来进行讲解的,虽然最新的稳定版5.6已经出来了一两年了,但是目前介绍MySQL的书籍有几本是5.0以上的?很难找到。人们一味地认为,即使软件版本怎么发展,很多内部的东西是不会变的,真的不会变吗?或许吧,但随着技术的快速发展,很多编程语言、系统架构都会吸收一些其他软件的优良之处以使自己的性能得到提升,这样就难免会有很多使用上必须更改的地方,即使只介绍以前的知识,但那些书籍至少也应该在后续的版本中介绍一下新版本的一些新的功能,哪些地方有改变。在看这本书之前的我,一直看的是那些所谓的计算机经典书籍,当然,我必须承认他们确实经典,无论再过多少年,他们依然是经典,但是他们中有很多东西于现在看来确实有些过时了。从本书开始,我对技术书籍有了更新的了解,也对如何选择书籍有了更深的领悟。

我一直使用MySQL,虽然没用过Oracle,不好对其发表评论,但就像现在大公司流行去IOE一样,我也深深地觉得他们三家确实太垄断了。现在我也在管理两个服务器,因为上次一气之下把服务器重装了系统,导致一些数据没有备份(还好都不重要),所以现在也开始关注服务器的管理了。本书并不是讲SQL的基本知识,所以适合的读者群应该是有一定基础知识并真正管理过MySQL数据库的人。另外,书中提到的大量的实践的知识,就不在这里详述了,已经将其整理到我的MySQL的其他几篇文章中去了。

PS:华章的图书虽然纸质上不大好,但整体触觉还是挺爽的。

《编程珠玑》

第一部分 基础

第1章 开篇

问题抽象描述:对10^7个正整数进行排序,只能使用1MB左右的内存空间

解决方案:使用位图,每个比特位代表一个整数,如果出现该整数则将该位置为1.

应用:该方法适合输入数据限制在相对较小的范围内;数据没有重复;而且对于每条记录而言,除了单一的整数外,没有任何其他关联数据。位图的数据结构,描述了一个有限定义域内的稠密集合。

第2章 啊哈!算法

问题抽象描述:
A.找出一个不在40亿个随机排列的32位整数的顺序文件中的数,仅有几百字节的内存
B.将一个n元一维向量向左选装i个位置,仅有数十个额外字节的存储空间,在正比于n的时间内完成向量的旋转
C.找出一个英语字典所有变位词集合。(pots,ptos, stop这种变位词)

解决方法:
A.二分搜索:采用已知包含至少一个缺失元素的一系列整数作为范围,并使用包含所有这些整数在内的文件表示这个范围。通过统计中间点之上和之下的元素来探测范围;或者上面或者下面的范围具有至多全部范围的一般元素。由于整个范围中有一个缺失元素,因此我们所需的那一半范围中必须也包含缺失的元素。
B.其中以前在很多地方都看到过这个方法,从ab开始,首先对a求逆得到c,然后对b求逆得到d,最后整体求逆,就得到ba了,然后各段的逆又可以在内部再次求逆,以此递归。
C.标识字典中的每一个词,使得在相同变位词类中的单词具有相同的标识。

第3章 数据决定程序结构

对数据结构所带来的方便进行了一些简述,这些在当今高级语言中都有所体现。

第4章 编写正确的程序

本章通过一些证明方法来证明了一个算法的正确性,由于我已经在《算法导论》里面饱受了数学的折磨了,这张直接跳过了,完全看不懂。

本章还介绍了一种用于检验程序正确性的方法,断言(assertion)或者叫不变式(invariant)。由于输入、程序变量和输出之间的关系勾勒出了程序的“状态”,断言使得程序猿可以准确阐述这些关系。

第5章 编程小事

本章写了一些测试的方法,不过都是手动进行测试。毋庸置疑,测试在编程中绝不是小事,特别是大型项目的开发,作者以小见大,说明了测试对于系统的稳定性和优化所带来的重大影响。

第二部分 性能

第6章 程序性能分析

从设计层面将程序性分为了几个方面:问题定义、系统结构、算法和数据结构、代码调优、系统软件、硬件。也有一个简单的分析方法就是看算法的复杂度,用O来表示那种。

第7章 粗略估算

本章使用生活中大量的例子来描述如何进行粗略估算,最近正好在看《蝎子网络》,发现我的数学功底越来越差,实际生活中有大量的使用估算的地方,比如,验证一些生活常识、验证一些新闻的正确性等。日常生活中的速算。

粗略估算的一些基本技巧:快速检验、经验法则(72法则)。还有一些估算定律:Little定律(队列中物体的平均数量为进入速率与平均停留时间的乘积。)

第8章 算法设计的技术

本章主要讲述了分治算法,这一算法我曾在算法导论上看过。

本章还介绍了几个重要的算法设计技术:保存状态,避免重复计算;将信息预处理至数据结构中;分治算法;扫描算法;累计;下界。

第9章 代码调优

本章介绍了优化代码的一些简单的思想和方法。例如将最常见类型的空闲记录缓存在一个链表中。然后,就可以通过对该链表的快速访问来处理常见的请求,而不必调用通用的内存分配程序。恰当使用函数、宏和内联代码。

”代码调优的最重要的原理就是尽量少用它.“

第十章 节省空间

Unix操作系统发明者(Dennis Ritchie和Ken Thompson)在论文中说道:“在系统及其软件方面,总是存在着相当严重的空间约束。如果同时对合理的效率和强大的能力提出要求,那么空间约束不仅具有经济上的意义,还会使设计更优雅一些。”

其实节省空间在所有地方都可以看到,比如在最初定义一个整数位数的时候,我一直使用的是int,但是如果要节约空间就使用其他的一些分配方法。

hash(散列表)特别适合某些稀疏场合。

如果一定要消耗时间来节省空间,在有些变量的计算上选择不存储,重新计算的方法更有效。在给变量分配内存时就使用动态分配。

第三部分 应用

第11章 排序

作者通过自己对快速排序的几种方法的改进超越了库函数。就像其他任何强大的工具一样,我们经常会在不该使用排序的时候使用排序,而在应该使用排序的时候却不使用排序。

第12章 取样问题

研究的一个问题就是输出随机数,虽然很多语言都提供了类似的随机函数,但是感觉目前大多数语言,特别是传统语言的随机几乎都无法做到真随机,必须自己在假随机上进行修改。

第13章:搜索

线性结构;二分搜索数。并提到了库的作用,C++标准模库提供了一个实现起来很容易,并且维护和扩展也比较简单的通用解决方案。当遇到涉及数据结构的问题时,我们的第一反应应该是寻求解决问题的通用工具。当然,有些时候针对特定的问题,使用专用的算法可能会大大提高运行速度。我们还要使用代码调优方法,比如将递归函数重写为迭代版本可以使链表的速度提升为原来的3倍,对大多数结构来说,引入哨兵可以获得清晰、简单的代码,并缩短运行时间。

第14章:堆

堆其实也是一种二叉树,但其有两个不同的性质:一是顺序性,任何结点的值都小于或等于其子结点的值。第二个性质就是形状,不是完整的三角形,右下角可以缺一点。

第15章:字符串

通过单词、短语和文本几个方面来处理字符串

《编程珠玑》(续)

第一部分 编程技术

第1章 性能监视工具

通过一些常用的代码性能监视工具,如行计数性能监视、过程时间性能监视等可以查看到一个程序里面各条语句的执行情况,以查找代码中执行最慢的地方,因为“一个程序中不到4%的语句通常占用了一半以上的运行时间”。我们最应该优化的就是这个地方。

第2章 关联数组

貌似本书很多章都是使用的Awk来讲解,但是Awk中的关联数组,我感觉就很像其他脚本语言中的字典,十分方便,但awk对字符串的处理可能更加方便,不过我是不喜欢其编码风格的。

第3章 程序猿的忏悔

再次提到调试脚手架的重要性,这一点上,Awk语言确实能起到很大的帮助,“Awk是一种构造算法原型的很好的语言,其内联数组使你模拟许多常用的数组结构,它的字段、隐式循环、模式-动作对等设计极大地简化了输入输出过程,隐式的变量声明和初始化也使得程序更加简洁。”。正如Fred Brooks认为“一个软件产品中应该有一半的代码都是脚手架”。

第4章 自描述数据

作者是使用的文档生成器来描述,其实本章所说的自描述数据在某种意义上类似于其他语言的一种模版,比如留下%s等占位符,让其他变量来填充。

第二部分 实用技巧

第5章 劈开戈尔迪之结

背景:在古希腊神话中,能解开戈尔迪之结者就可以当亚细亚之王,几百年后亚历山大大帝来了。他没有重蹈覆辙,而是拔出剑来,将结直接劈开,随即征服了亚洲。从那时起,“劈开戈尔迪之结”意味着为复杂问题找出聪明的解法。

我们在寻找解决问题的方法的需要考虑如下几个问题:什么是用户真正的需求(用户要求可预测性甚于要求速度);考虑成本与收益的平衡;别把问题弄得太复杂也别太简单;用正确的方法使用正确的工具;对员工的奖赏。。。

简单的方法谁都想要,但并不是每个人都能找得到,我们还应该考虑时间成本,别花过多时间去思考简单的方法,没准一个你目前觉得复杂的方法可以很快完成项目。

第6章 计算机科学箴言集

居然把一些计算机的箴言单独列为一章,我也是醉了。

第7章 粗略估算

在原书已经有了几乎一样的内容…

第8章 人员备忘录

大神,这是你自己的日记吗?

第三部分 人性化I/O

第9章 小语言

作者以Pic为例子讲解了一种小的语言是如何运行起来的,相信看过编译原理的同学都能理解。

第10章 文档设计

原以为是要教我们关于PRD这样的文档的写法,不过只是教了我们一些写Word文档的基本的规则,不过我觉得一个有基本审美观的人无论怎么写也不会写得很差的。

第11章 图形化输出

合理使用图形工具。

第12章 对调查的研究

也是借调查这一事件来强调模版的好处。

第四部分 算法

第13章 绝妙的取样

好吧,就是随机数的一些个问题。

第14章 编写数值计算程序

牛顿迭代,这个我倒是完全理解。本章学到重要的一点就是“在特殊的上下文环境中针对特殊目的设计的代码比通用的程序更有效”。

第15章 选择

使用分治算法来进行选择,太聪明了。

作者:Jon Bentley

本书的作者通过一个一个实际生活中的例子来给引导我们对编程进行思考,虽然在实际工作中我们多半是只使用思考的结果,但本书更重要的是让我们了解到发现问题本源,并真正解决问题的一个思考过程。本书主要提出了一些抽象概念,目的不是像《算法导论》那样先提出抽象问题,然后进行实际的讲解与编码,而是一步一步带领我们如何更好地解决问题。

其实本书后半部分包括续集,其质量都不高(我是这么认为的),都是讲一些没多大用的东西。其实我从中学到最多的就是位图的使用以及实际开发过程中需要注意的一些问题。

没想到,小小的位图对于海量数据的处理还有这么大的功效。当然了,书中所说的所有问题以及思考我都没有去真正编码过,但我觉得自己能写好80%的代码(感觉和事实肯定不一样的。)

语录

1.对小问题的仔细分析有时可以得到明显的实际益处。

2.明确了问题,那这场战役就成功了90%

3.设计者确定其设计已经达到了完美的标准不是不能再增加任何东西,而是不能再减少任何东西。——Antoine de Saint-Exupery

4.程序员在节省空间方面无计可施时,将自己从代码中解脱出来,退回起点并集中心力研究数据,常常能有奇效,(数据的)表示形式是程序设计的根本。——Fred Brooks

5.计算机系统中最廉价、最快速且最可靠的元件是根本不存在的。——Gordon Bell

6.当程序性能问题无法回避时,考虑设计层面会有助于程序员集中精力解决问题。如果仅需要较小的加速,就对效果最佳的层面做改进,因为“性价比”最高的那一个投入最小的精力就可以获得最大加速系数的那个设计层面。如果需要较大的加速,就对多个层面做改进。

7.任何事都应尽量简单,但不宜过于简单。——爱因斯坦

8.代码调优的最重要的原理就是尽量少用它

9.解决现有的问题是程序员任务的一部分,另一个也许更重要的部分是做好解决未来问题的准备。本章示例了编程过程中的几个重要步骤:正确理解所遇到的问题;提炼出抽象问题;考虑尽可能多的解。

10.如果还没想清楚,就用蛮力算法吧。——Ken Thompson

11.代码写得越急,程序跑得越慢。——Roy Carlson

12.如果你发现特殊情况太多,那你肯定是用错方法了。——Craig Zerouni

13.在我所有的程序错误中,80%是语法错误。剩下的20%里,80%是简单的逻辑错误。在剩下的4%里,80%是指针错误。只有余下的0.8%才是困难的问题。——Marc Donner

14.在系统测试阶段找出并修正错误,要比开发者自己完成这一工作多付出2倍的努力。而当系统已经交付使用之后找出并修正一个错误,要比系统测试阶段多付出9倍的努力。因此,请坚持让开发者进行单元测试吧。——Larry Bernstein

15.新系统的每一个新用户都可能发现一类新的错误。——Brian Kernighhan

16.对于那些快速算法,我们总是可以拿到一些速度差不多但是更容易理解的算法来替代它们。——Dougls W. Jones

17.在一个非I/O密集型的程序中,超过一半的运行时间是花在不足4%的代码上的。——Don Knuth

18.在优化一个程序之前,请先用性能监视工具找到程序的“热点”。——Mike Moron

19.【代码规模守恒定律】当你为了加速,把一页代码变成几条简单的指令时,请不要忘了增加注释,以使源码的行数保持为一个常量。——Mike Morton

20.纸上的工作没结束,整个工作也就还没结束。

21.【90-90法则】前90%的代码占用了90%的预定开发时间,余下的10%代码又花费了90%的预定开发时间。——Tom Cargill

22.正确的判断来源于经验,然而经验来源于错误的判断。——Fred Brooks

23.如果有人基本上做出了你想要做的东西,你就没必要自己写一个新程序。就算你非写不可,也请尽可能多地利用现有的代码。——Richard Hill

24.先让程序跑起来,再考虑怎么让程序跑得快。——Bruce Whiteside

虽然用U盘装过很多次系统了,但昨天突然感觉制作完win7启动盘后,那个图标也太丑了吧。所以毅然决定改了一下,通过这种改动,无论是在什么电脑上都能显示出来的。

1.制作图标

U盘的图标其实png, jpg, ico什么类型的都支持的,但是为了美观,最好选择png或ico,我就用的ico,因为这两者会把透明部分真正透明化。至于怎么
制作ico,可以使用Photoshop修改好了过后保存为png图片,然后在线将png转换为ico格式:[图标在线转换工具](http://www.img2i
co.net/)

2.在U盘根目录新建文件autorun.inf

内容如下:

[AutoRun.Amd64]
icon=haofly.ico




[AutoRun]
icon=haofly.ico

3.将图片haofly.ico拷贝到U盘根目录

4.结果如下



在我的印象里,虚拟机在安装增强功能后是可以直接互相拖放文件的,但不知道为什么最近几个月我安装的都不行啊,所以这里记录一下通过映射来共享文件的方法。

虚拟Linux Server

  1. 和win一样,点击虚拟机的_设备->安装增强功能_

  2. 不同的是linux_server 上面不会自动弹出安装界面,而是需要挂载在安装,执行如下命令:

    $ sudo mount /dev/cdrom /media/cdrom
    block device /dev/sr0 is write-protected, mounting read-only
    $ cd /media/cdrom
    $ sudo ./VBoxLinuxAdditions.run

  3. 在设置里面添加共享文件夹:
    ![](http://7xnc86.com1.z0.glb.clouddn.com/virtualbox-guest-host-share-
    file_0.jpg)

  4. 记住上面的共享的名称,比如company,那么在linux_server里面就可以看到_/media/sf_company_这一个目录。

  5. 如果在linux_server往那个目录添加东西时出现_Read-only_错误,可能是VirtualBox默认禁止在共享目录里建立链接(stackoverflow解答),此时应该执行如下命令,其中,VM_NAME表示你的虚拟机的名称,SHARE_NAME表示共享的名称(不加前缀sf_) 如果是windows主机,在cmd里执行:

    VBoxManage.exe setextradata VM_NAME VBoxInternal2/SharedFoldersEnableSymlinksCreate/SHARE_NAME 1

如果是linux主机,在shell里执行:

    VBoxManage setextradata VM_NAME VBoxInternal2/SharedFoldersEnableSymlinksCreate/SHARE_NAME 1

虚拟Windows

1.还是要安装增强功能

![](http://7xnc86.com1.z0.glb.clouddn.com/virtualbox-guest-host-share-
file_1.png)

安装完成后关机,之所以不重启,是因为还有要设置的地方。

2.设置共享文件夹

![](http://7xnc86.com1.z0.glb.clouddn.com/virtualbox-guest-host-share-
file_2.png)
我一般喜欢把共享文件夹设置为固定分配、自动挂载、完全访问权限。

3.添加映射

[![](http://7xnc86.com1.z0.glb.clouddn.com/virtualbox-guest-host-share-
file_3.png)
](http://haofly.net/wp-content/uploads/2014/10/virtualbox-share-
file-4.png)![](http://7xnc86.com1.z0.glb.clouddn.com/virtualbox-guest-host-
share-file_4.png)
![](http://7xnc86.com1.z0.glb.clouddn.com/virtualbox-guest-host-share-
file_5.png)
点击浏览,找到文件夹,确定

![](http://7xnc86.com1.z0.glb.clouddn.com/virtualbox-guest-host-share-
file_6.png)
![](http://7xnc86.com1.z0.glb.clouddn.com/virtualbox-guest-host-share-
file_7.png)
成功!

最近做一个项目,需要从一个Python文件里执行其他的Python文件,因为数量可能有点大,所以考虑了一下性能的问题,就去简单地测试了一下其效率,结果如下:

首先,我的另一个Python文件test1.py里内容如下,执行一条command命令

import os
os.putenv('PATH', 'C:\\Program Files (x86)\\Git\\bin')    # 我的ls命令在git下面
os.system('ls -ls')

1.使用exec函数

在Python3中无法直接使用execfile()函数,execfile被分解为了open()和exec(),[详见文档](https://docs.pyt
hon.org/3/library/functions.html#exec),必须先将文件打开,再把文件浏览当作参数传入exec函数中去。代码如下:

import os




for time in range(0, 1000):
        fp = open('test1.py')
        exec(fp.read(), None, None)
        #os.popen('ls -l')

执行一千次该文件,结果如下:内存几乎无变化,CPU使用率62%左右,耗时86.3s
![](http://7xnc86.com1.z0.glb.clouddn.com/python-execute-pythonfile-
effiency.png)

2.使用os.popen()函数

os模块的popen()函数是相当于执行的是一条command命令,并可以通过read()方法获取命令的输出,代码如下:

import os




for time in range(0, 1000):
        fp = open('test1.py')
        #exec(fp.read(), None, None)
        os.popen('ls -l')

执行一千次该循环,结果如下:内存几乎无变化,CPU使用率90%左右,耗时118.1s

![](http://7xnc86.com1.z0.glb.clouddn.com/python-execute-pythonfile-

effiency_1.png)

3.结果

从上面很明显的就能发现,使用Python3里面的exec不仅占用CPU率较低,并且执行时间也较快,而在占用内存方面两者几乎都一样。所以,还是使用exec吧。

4.扩展

顺便测试了一下使用os.system()函数和os.popen()函数的区别,当然这里的测试是在单个文件里执行一千次该命令,如下:

import os




os.putenv('PATH', 'C:\\Program Files (x86)\\Git\\bin')    # 我的ls命令在git下面




for time in range(0, 1000):
        os.system('ls -l')
    # os.popen('ls -l')

os.system()的结果:CPU占用65%左右,内存几乎不变,耗时83.5s
![](http://7xnc86.com1.z0.glb.clouddn.com/python-execute-pythonfile-
effiency_2.png)
os.popen()的结果:CPU占用90%左右,内存几乎不变,耗时38.4s

![](http://7xnc86.com1.z0.glb.clouddn.com/python-execute-pythonfile-
effiency_3.png)

在网上找了几天时间,发现网上的方法都有一定的局限性,因为我想要的是在同一台服务器上实现一个nginx做反向代理到多个apache(再一次感叹网上好多教程的落后和千篇一律)。这里再次记录本次的配置过程。

环境:Ubuntu14.04 server + nginx(1.4.6) + apache2(2.4.7)

目的:使用nginx做代理,分别代理到apache的四个监听端口8080/8081/8082/8083 优点:Nginx可应付高并发,使用Proxy做代理效率也较高,占用资源少,再使用apache处理后端,也更稳定,现在一般的做法是是用nginx处理前端,apache处理后端,我这里暂时全部交由apache处理。当然,我这里都是在同一台服务器上做的,除了减少单个apache的并发处理数量,对性能来说并没有显著的提升。

1.安装nginx和apache2

安装到没什么好说的,直接apt-get安装即可。

2.修改nginx的配置文件/etc/nginx/nginx.etc

在http字段(就是那个大括号里面)添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
upstream balance{
server localhost:8080;
server localhost:8081;
server localhost:8082;
server localhost:8083;
}

server{
listen 80;
server_name haofly.net;
localhost /{
proxy_pass http://balance;
}
}

其中nginx是让upstream里面的各个IP/端口实现轮询访问,研究一下nginx的配置文件,还可以对轮询访问加上一些限制条件,比如轮训机制、权值分配等,这里不做详述。

需要注意的是如果是二级域名,那么upstream里面的server依然写成localhost:port的形式,而不用去写什么二级域名,二级域名在apache的配置文件里面定义,nginx会直接将那些都传给它的。

3.修改apache的配置文件

主配置文件/etc/apache2/apache2.conf,在#ServerRoot "/etc/apache"下添加一行指明ServerName,例如:

#ServerRoot "/etc/apache2"
ServerName haofly.net

虚拟目录配置文件(这就相当于为apache多开了几个线程,就好像是有多个apache在同时工作一样) vim /etc/apache2/sites-available/000-default.conf(这是默认的那个80端口的配置文件),只需要把里面的80端口改为8080即可。然后再新建几个配置文件vim /etc/apache2/sites-available/proxy01.conf内容如下:

1
2
3
4
5
6
<VirtualHost *:8081>
ServerAdmin localhost:8081
DocumentRoot /var/www/html
ErrorLog $\{APACHE_LOG_DIR\}/error.log
CustomLog $\{APACHE_LOG_DIR\}/access.log combined
</VIrtualHost

8082端口的配置文件proxy02.conf只需要把端口改为8082即可,另外为方便测试,我们需要把8083端口的配置文件特殊化一下,vim /etc/apache2/sites-available/proxy03.conf,内容如下:

1
2
3
4
5
6
<VirtualHost *:8083>
ServerAdmin localhost:8083
DocumentRoot /var/www/test
ErrorLog $\{APACHE_LOG_DIR\}/error.log
CustomLog $\{APACHE_LOG_DIR\}/access.log combined
</VirtualHost>

其实只是修改了DocumentRoot,使它指向/var/www/test,这样就方便测试了,/var/www/test下新建一个文件vim/var/www/test/index.html,内容如下

<html>
 hehe
</html>

在把配置文件链接到/etc/apache2/sites-available文件夹:

cd ../sites-enabled
sudo ln -s ../sites-available/proxy01.conf
sudo ln -s ../sites-available/proxy02.conf
sudo ln -s ../sites-available/proxy03.conf

最后再修改apache的端口文件vim /etc/apache2/ports.conf,把Listen *80修改为:

Listen 8080
Listen 8081
Listen 8082
Listen 8083

4.测试

首先检查配置文件是否有语法错误

nginx -t
apachectl -t

如果都OK,就可以重启了:

service apache2 restart
service nginx stop
service nginx start

然后在浏览器输入上面的Servername,即http://haofly.net,多刷新几次,就会发现,有时候出现的是apache的界面,有时候出现的是test下那个hehe界面。

5.nginx添加二级域名

比apache简单多了,我这里不仅添加了二级域名,并且也实现了一个反向代理,/etc/nginx/nginx.conf里面的http里面添加一个upstream和一个server即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
upstream {
server localhost:8084;
}
server {
server_name aa.hostname.com;
listen 80;
location / {
proxy_pass http://er;
proxy_redirect default;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
}
}

然后就像Apache简单配置以及设置二级域名 那样设置apache即可。

参考文章:

http://blog.csdn.net/yanggd1987/article/details/31375573
http://www.oschina.net/question/56436_109188