Loading...

Tag Archive for '%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96'

    AD: 猛买 | 快递查询 | Jobsdigg | 很棒的男装店

LAMP最小优化

假如你在Linode入手了一个VPS,迅速地部署了Ubuntu,然后使用一大堆apt-get把LAMP服务都搭好了(这整个过程也就10分钟吧,可以更短)。此时可以算是“It works”,但还颇有一些地方需要调整。本文就在这种场景下,写一下此时可以做的最小优化,作用范围不仅限于Linode、Ubuntu,其他系统也可以参考。希望对一些朋友有帮助。 Linux 日志切分 如果没有日志切分,日志可能很快会把硬盘塞满,最后不得不手动清理。做日志切分推荐用logrotate,易于配置,一旦配置完成就会默默无闻地工作。 调整swapiness swappiness用来控制使用系统swap的概率,ubuntu内核默认是60。建议修改为0,使系统尽可能使用物理内存而非swap。实际上,在上次Linode升级套餐后,我已经关掉了swap,系统运行得依然稳定。具体修改方法可以百度一下。 UPDATE: 经 @7id 提醒,swappiness参数更多的是降低磁盘io操作,对于内存不是特别小的情况,差别不大。详细请看下方留言。 Apache 启用压缩 启用压缩,可以减少传输的内容。对WebServer来说这几乎是必须的,但默认的Apache安装并未开启压缩。对于比较慢的连接,启用压缩会有更多好处。 调整MaxRequestsPerChild MaxRequestsPerChild用于设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果这个参数为0,Apache进程占用的内存会只增不减。一些使用Apache的VPS经常遇到iorate很高,可以尝试调整一下这个参数(ref)。 Mysql 关掉InnoDB 如果服务器用来放blog或是论坛,多数时候MyISAM就足够用了。此时可以把InnoDB关掉。my.cnf中的注释说:”You might want to disable InnoDB to shrink the mysqld process by circa 100MB.”。实测在VPS关掉Innodb时虽然没节约了100MB,但50M还是有的,内存珍贵,能省则省吧。 只需在my.cnf加入一行 skip-innodb 就可以把InnoDB的功能关掉。 PHP 开启输出缓冲 在使用mod_php时,如果不开Output Buffering,每一个输出都会使Apache向客户端发送数据,导致效率很低。使用fastcgi时,由于WebServer本身有buffer,影响并不大。但默认的apt-get安装,使用的就是mod _php,因此建议在php.ini里把Output Buffering打开。 – 以上只是一些最初级的调整,叫做“优化”都显得有点夸大。但在初期遇到问题时,调整这些地方往往可以很快见效。 除此之外,强烈建议用nginx换掉Apache。

Rails中压缩存储文本数据

继续压缩话题。之前写了 Rails生成压缩的静态缓存,以及配置nginx以支持直接发送压缩文件两篇文章。今天谈的是在Rails中,将大段文本内容以压缩格式存在数据库。这也是从公司的一个项目中获得的灵感。 原始需求 手头有一个结构简单的文本库,可以看做是key=>value。约180万条数据,2.8G(确实不算大,见笑了)。 这个库查询频繁,CPU在IOWAIT耗时颇多。 Linode服务器硬盘紧张,而CPU富裕。 若能通过压缩减小体积,备份/回导时也会更省时。 实施过程 整个实施过程做到了无缝转换,不需要停服务。 第一步:将文本字段类型由TEXT修改为BLOB;新增一个is_gzip字段用于标识是否经过压缩,默认为0。 * 需要注意,BLOB和TEXT最长支持65535字节。 第二步,修改Rails相应的Model。代码示例(压缩content字段): class TextData < ActiveRecord::Model def content if self.is_gzip Zlib::Inflate.inflate(super) else super end end def content=(info_content) super Zlib::Deflate.deflate(info_content, 9) self.is_gzip = true end end 再一次感叹super的便捷。修改代码后,需要重新部署一下Rails应用。 第三步,创建一个rake任务,用来批量做转换。关键部位只消这么做: text_data.content = text_data.content text_data.save 第四步,在做过修改的表上做一次optimize table,以释放那些不需要的空间。 效果观察 经如上处理,2.8G数据只剩1.4G。如果用了Gzip而不用Deflate,有可能更小。 IOWAIT未见明显下降。压缩前,单条记录理论上可以通过一次IO完成。 备份的速度确实有所提升,意料之中。 更多信息 这种思路同样适用于PHP、Python以及其他语言下的Web应用,只是在Rails中搞起来更为轻松。 Mysql提供了Compress/Uncompress两个函数,但是不建议直接使用。一方面会增加数据库服务器计算的压力;另一方面,如果用了主从,每个服务器都得算一次。 Zlib::Deflate.deflate 的第二个参数是压缩的level。我用随机数据测试,Level 9压缩后的体积比Level 1 [...]