Login

Memcache 启用

2008-07-03 00:25:16 by kommit

好久没写文章了……这两天试着折腾了一下 Memcache,今天把代码部署上来了。不过,还在测试阶段,所以在 config 里面加了一个开关用于启用或者关闭 memcache 的使用。还加了不少 logging,可以观察 cache 的命中率。

不知道这东西能不能有效地降低 CPU 的使用,不过我的 blog 本来访问量就很小,CPU 使用率一直不高,所以我正在寻找可以模拟浏览器进行大量(能分布式就更好了)访问的工具,来系统地测试一下。

Memcache 使用方法很简单,我在考虑要不要再啰嗦一篇心得呢?

Tags: caching, performance, plog, memcache

新增缓存机制 - HTTP Caching

2008-06-18 23:04:52 by kommit

上次提到的 theme 机制带来的性能下降,这两天我折腾了一下,期待有所改善:

在处理 theme 相关的文件(css/image)的请求的时候,在 Response-Header 中加上这几项:


Last-Modified: Wed, 18 Jun 2008 14:22:27 GMT
Cache-Control: max-age=600
Expires: Wed, 18 Jun 2008 14:48:39 GMT
Date: Wed, 18 Jun 2008 14:38:39 GMT


其中 Last-Modified 后面的日期是上次更新 config 的时间,Date 后面是当前时间,Expires 后面是当前时间 + 10分钟,10分钟就是 Cache-Control 后面的 max-age,单位是秒。因为看到 GAE 对 static 文件的 Cache 时间也是10分钟,所以我使用了这个数字。

Last-Modified

如果客户端收到的 Response 中包含 Last-Modified,那么下次 request 的时候就会在 Request Header 中包含 If-Modified-Since 字段,值就是上次服务器发送的 Last-Modified,服务器端会判断上次的 config 时间是否比 If-Modified-Since 晚。如果自上次 request 之后又更新了 config,那么服务器就会返回完整的内容;如果期间没有更新 config,那么服务器就没必要返回完整的内容,只需要向客户端发送一个 304 Not Modified 状态码就可以了。

Cache-Control、Date 和 Expires

这几个参数的组合,表示告诉浏览器:这个文件在多长时间之内不会更改,在这个时间内不需要再 request,保守起见,我设置了10分钟。

浏览器行为

如果只是在网站的链接之间 click click click,那么浏览器会完全遵守上述行为。这样可以尽可能地减少请求次数,以及 response 的数据量。

如果在某个页面点击了浏览器的刷新按钮或者按 F5,浏览器会忽略 Expires 时间,把该页面需要的所有的文件都重新请求一遍。

如果按住 Ctrl 再刷新或者 Ctrl-F5 (俗称强制刷新),浏览器将不会发送 Last-Modified Header,将所有需要的文件请求一遍,服务器会返回文件的完整内容,而不是仅仅一个 304 Not Modified 状态码。

后记

经初步观察,现在浏览器不会每次都彪呼呼地去请求一大堆 css、jpg、gif 文件了,浏览器也不会每次都脑残地返回完整内容了,看来是有效了。

之前没怎么研究过 HTTP 协议,上面这些都是这两天通过抓包分析得出来的结论,然后参考了一下 django 的代码。不知道有没有不对的地方,欢迎大家指正。。。

另外有朋友建议我使用 MemCache API 来减少服务器端的计算量,这个我确实正在考虑。而且理论上确实可以提高效率。

在 GAE 提供的有限的资源上折腾,真是一件有意思的事情。

Tags: caching, performance, plog, http, dev

脱胎换骨……呃,重做人

2008-06-14 14:08:52 by kommit

“感谢党,感谢人民,感谢CCTV,Plog 终于,终于支持自定义主题了。”

代码中放了一个 theme 目录,里面包含了若干子目录,每个子目录表示一个主题。其中有一个 default 主题,就是俺之前改了无数次仍然巨丑无比的主题。另外在我提交到 svn 的代码中,还包含了两个从 Free CSS Templates 偷来的主题,现在用的这个就是。

每个主题目录中需要包含一个 css 文件,以及主题所需要的其它文件,比如图片。另外有一个可选的 templates 目录,用来存放重写的模板文件。

在 Config 中选择了新主题之后,用到所需的模板文件会先在主题的目录的 templates 下面寻找,如果找不到,就会用 default/templates 下面的。

这样的话,如果 theme 的作者希望改变一下生成的 html 代码,只需要重写一部分 template 文件,放到该主题的 templates 目录下面就可以了。

添加现成的主题也很方便,只要把主题目录丢到 themes 目录就可以了。

打算再偷几个主题来看看,一是为了增加一些默认可以选择的主题,二是多做几个主题可以再调整一下 default 的模板文件,使得制作 theme 更容易。

不过增加了 theme 机制带来了一个小小的(希望是) drawback:
GAE 把上传的代码文件分为两类,一种是 static 文件,一种是普通的代码。可以在 app.yaml 中指定。前者为了效率的考虑,没有放在代码可以读到的文件系统目录里面,但是 plog 需要动态地读取 theme 目录下的子目录以及 templates 文件,于是 theme 没有作为 static 文件放上去,这样的话那些 css、图片文件之类的就享受不到 static 的好处了,我只好做了一个 request handler 去读取这些文件。估计会带来性能的下降以及 CPU 使用量的上升。

另外 plog 代码中还有一些地方比较占用 CPU,我抽空再优化一下。

Tags: plog, theme, appengine, 美工

Plog 的 FAQ

2008-06-08 13:50:59 by kommit

这里

Tags: plog

去掉了难看的 logo

2008-06-05 23:11:24 by kommit

然后似乎更难看了......我要学习网页美工!!

另外有些朋友问我 plog 怎么使用。。。我承认我比较懒,代码没注释,程序没文档(最近对文档有严重的抵触情绪......)。有些东西确实不是那么容易明白的,比方说让 最近评论 widget 在右侧栏显示应该在Preference->Custom Sidebar 里面加上:

{{ W.RecentComments }}

如果我不说的话,估计就会很少有人知道......

最近看到不少朋友关注 plog,我也比较开心,我会继续完善它。首要的任务是先写一个简单的文档......这个周末先写一下使用上的 faq 吧。

Tags: plog, 美工