Monthly Archives: November 2009

online traceroute

几个可以在线 traceroute 的网站,不光是 traceroute,还有其它的网络工具可用。 http://centralops.net/co/ http://ping.eu/ http://just-traceroute.com/ http://network-tools.com/ http://www.tracert.com/trace_exe.html http://networking.ringofsaturn.com/Tools/traceroute.php http://www.traceroute.org

Posted in 网络与系统 | Comments Off

一道 C 语言试题

#include <stdio.h> int fun(void) { static int count = 10; return count--; } int count = 1; int main(void) { printf("global\t\tlocal static\n"); for(; count <= 10; ++count) printf("%d\t\t%d\n", count, fun()); return 0; }

Posted in C/C++ | Comments Off

Nginx 整体结构

Nginx 可以是单进程,多进程或者多进程中的每个进程是多进程几种模式; 但是每个进程中多线程的情况似乎文档没说。 普通情况下是一个主进程多个工作进程,如果设置 master_process 为 off,则 nginx 只有一个进程,这个选项不要在生产环境中使用。 默认情况下这个选项是 on 的,此时是一个主多个 worker 进程。 配置文件的解析在 ngx_init_cycle 函数中,它被 main 调用。 如果只有一个进程,则进入 ngx_single_process_cycle;否则进入 ngx_master_process_cycle。 ngx_master_process_cycle 中将利用 ngx_start_worker_processes 产生多个工作进程;而主进程位于 for(;;) 循环中。利用 sigsuspend 来等待外来的信号响应。 每个工作进程被产生出来以后会进入 ngx_worker_process_cycle 函数。 如果工作进程中有线程,则线程产生出来后调用 ngx_worker_thread_cycle 函数,这些线程会 sleep 在 ngx_cond_wait 函数中等待唤醒,醒来后处理 … Continue reading

Posted in Nginx, 系统编程 | Comments Off

呆基轮回

2 年以来,股市轮回,哪些基金亏损较小? 数据截止到 11 月 19 号。 来自 http://fund.cmbchina.com/CmbFund/FundAspxBin/OpenFund/fundKFSSYRank.aspx 指数型基金 代码 基金简称 1月(%) 排名 3月(%) 排名 6月(%) 排名 1年(%) 排名 2年(%) 排名 今年以来(%) 排名 设立以来(%) 162102 金鹰小盘 14.75 1 19.96 4 18.36 45 88.70 1 -1.17 1 79.28 3 198.67 … Continue reading

Posted in 投资 | Comments Off

遥对窗

遥对窗 微风挑动鬓发霜 感怀旧时同窗,五月微凉 华灯照 道旁行人两路茫茫 谁人与君 共诉衷肠,诉衷肠 诵童谣 弱冠少年旧模样 同乐稚气时光,盛花芬芳 心亦凉 今日聚首只余三两 情之奈何 叫人心伤,人心伤

Posted in 杂七杂八 | Comments Off

Up 中的表示声音的词语

cheer 这个不用说了,人群的欢呼。 gasp (因惊异或力竭)吸气, 喘气: 在片中人们看到骨架时发出了 gasp。 horn 喇叭,(牛、鹿、羊等动物的)角 honk 鸣笛,喇叭声 honk 也指大雁或者鸟的声音 grunt 呼噜声、哼哼、咕噜的声音 bark 狗的吠声 stammer 口吃,结巴的样子 static electricity buzz 静电的滋滋声 scream 惊叫声 thud 沉闷的声音,片中 kevin 走路的那种声音 siren wailing 汽笛的声音 wail 也有 (大声)哭, 诉苦(通常指尖声地)的意思。 groan 叹息、呻吟的声音 joint cracking … Continue reading

Posted in 学英语, 电影世界 | Comments Off

Nginx 输出的流程

ngx_modules.c 中定义了所有的模块,其中有几个特殊的模块:ngx_http_header_filter_module、ngx_http_write_filter_module 和 ngx_http_copy_filter_module。 前两个模块没有指令,但是有 ngx_http_header_filter_init、ngx_http_write_filter_init 作为模块的 postconfiguration 函数指针。并给 ngx_http_top_header_filter、ngx_http_top_body_filter 赋初始值 ngx_http_header_filter 和 ngx_http_write_filter。 对于静态文件,会有一个模块 ngx_http_static_module,这个模块好像也是没有指令,它会往 NGX_HTTP_CONTENT_PHASE phase 中添加一个 handler 函数(ngx_http_static_handler)来处理静态文件,别忘了 ngx_http_core_run_phases 会调用不同 phase 的 checker,而 checker 将会调用 handler;所有静态文件的输出应该都在这个里面完成。 然后 ngx_http_output_filter 会调用输出函数 ngx_http_top_body_filter。 ngx_http_copy_filter_module 与 ngx_output_chain_ctx_t 中 output_filter 的作用: copy_filter … Continue reading

Posted in Nginx | Comments Off

一种 mysql 系统设计方案

最近有一个 Mysql 库设计,要可以装下至少 60 亿条记录,毫无疑问只有分片了;最后决定分 6000 个片;接下来要考虑要在多少个实例中承载这 6000 个片了;在初期,也许用户并不多,因此可以在一个或者几个实例中承载这 6000 片,但是随着用户数的逐渐增加,不得不需要更多的实例了。 一台物理主机上运行多个实例,一个实例中有多个库,一个库中又有多个片;我们将所有的实例都进行编号,从 1 到 120。对于应用程序而言,对数据库的连接涉及到一个三元组:主机地址、端口和数据库名。为了便于迁移,所有实例的端口都是不重复的,主机名都用域名,也尽量设计成不重复的。对于表名的设计则是将片号附加在表名的开头。 对片号的取得是通过哈希来完成。应用首先根据预先定义的规则(比如通过用户名得到哈希值)获取片号,再到 memcached 中查询这个片号对应的实例编号;然后根据实例编号查询 memcached 中的三元组即可得到连接信息。 最开始可能是所有的实例都在一台服务器上,随着数据的逐步灌入,负载逐步加大,首先需要考虑拆分的是将不同 Mysql 实例分布到不同服务器上,这个过程应该不难办到,这种拆分的极致便是一台服务器上只运行一个实例。如果这个实例太大,则考虑减少一个实例中的数据库数目,将实例中的部分数据库拆分出来放到其它的实例之中(或者新建实例)。每次拆分之后都需要修改 memcached 中的对应关系。最极端的情况可能就是一台服务器上一台实例,其中只有一个库,而这个库中只有一个片。 可能存在哈希不均匀的现象,很多用户都被哈希到一个片中,导致一个片中的数据奇多,此时可以在另外一个地方保留这种”特殊“用户到他所属片号的对应关系(一旦找到这种关系,即不再通过计算来得到片号)。

Posted in mysql, 系统架构 | Comments Off

Maildir 格式的问题

Maildir 和 mailbox 应该是最常见的传统的邮箱格式,一个是将用户邮件全部存放于一个文件之中,另一个则将邮件以单个文件的形式存放,一个邮件夹对应磁盘一个目录,而一封邮件对应一个文件,在小规模的应用中 Maildir 大概是没有问题的,但是在海量用户规模和长时间积累的情况下,Maildir 存在很多问题: 1、无法以活跃用户、最热邮件来做区分服务: 在传统的 Maildir 中,所有用户都是平等的,这意味着用户如果长期不登陆,那么它将与经常登录的活跃用户使用同样的存储空间,这明显对于活跃用户不公平; 海量空间甚至不限空间邮箱的出现使得用户很少删除邮件,传统的 Maildir 格式将用户一个邮件夹下的所有邮件都放于同一个磁盘目录,很明显的缺点是:不利于扩容;而且考虑到区分服务的要求,应该将用户很久以前的邮件放到廉价的存储设备上。 2、限制了对新功能的添加: 邮件不止是邮件,很显然会不断添加新功能:比如标签、搜索、会话邮件模式、代办邮件等,在单纯的 Maildir 中是难以做到的。 3、大量实时和随机的存储访问可能导致较高的故障率: 对邮件可能的操作最主要的是打开读取和删除,高峰时类似删除这样的操作应该考虑延迟处理,这可以减少删除操作对存储访问的随机性。如不能区分冷热邮件,此问题会更严重。 4、用户邮件数据过于集中,增加了对存储管理调整的难度和频度: 如果存储设备发生故障,一批用户的所有邮件可能都会受到影响,再实行区分服务和分冷热存储之后,可以将运营重点放在活跃用户和最新收到的邮件上。 因此需要一个高效稳定的系统来达到这样的目标:存储邮件的索引信息(主要是位置和状态)以及较高访问频率的信息;在系统中区分出活跃用户与不活跃用户、新邮件与归档的老邮件;邮件投递时能自动根据配置来将邮件投递到可用的设备上;能根据不同指标(主要是距离当前时刻的时间)来将邮件以不同格式存储,达到尽量节省存储老邮件空间的目的;存储可以线性增长并尽量被顺序访问。

Posted in 系统架构 | Comments Off

飞屋环游记

http://bbs.service.sina.com.cn/thread-479-3/table-9134-86.html 一部很温情的动画片,让人想起自己曾经的梦想和诺言; 当青春远去,你是否离自己的梦想原来越远?生活的压力和苦难使我们忽略了很多原本很美好的东西。 走到人生一半的旅程,需要反思。

Posted in 电影世界 | Comments Off

朱迪加兰

这几天看到有《绿野仙踪》蓝光版的压制,顺便下了下来,虽然先前已经下过其它版本的,不过既然是蓝光,应该比以前的更好,顺便看了一下这个片子。 《绿野仙踪》据说被称为是最有名的童话之一,但它可能不仅是一部简单的童话,其实包含着对当时美国社会的轻微映射。它的导演就是大名鼎鼎的《乱世佳人》的导演,两部在电影史上空前绝后的作品都出自同一人,而且是同一年。 《绿野仙踪》的主演朱迪加兰当年只有 17 岁,她也是美国历史上最有名的女演员之一。 影片从“飞越彩虹”开始 ,朱迪加兰唱着活泼轻快的小调,在浓郁的童话色彩中蹦跳奔跑着,无比快乐。当年的米高梅公司是很有权势的公司,他们捧红了朱迪加兰,也使得她成为一个瘾君子。朱迪加兰成名以后,被迫吃药减肥,难以想象片中善良活泼的多萝西,属于她的童话世界,本应是孩子贪玩的年纪,却全部葬送在了演艺圈中,过早的食用精神药品,最后依靠毒品来过生活,终于在 47 岁那年离开人世。回顾电影时,让人感到耳边传来的还是她甜美清澈的嗓音,一副孩子的美声唱腔,无忧无虑,这个时候她的人生就像是在童话电影里才有了价值。 朱迪加兰的去世和葬礼,与石墙事件的发生,并无法证明有直接关系,但间接的关系肯定是有的。 她的女儿是一位非常有名的歌手,算是对她职业的继承。 朱迪加兰的其它作品估计只有放在博物馆里了,1974 年米高梅发行了 Thats.Entertainment,1976 年发行了 Thats.Entertainment II,这两部作品汇集了米高梅辉煌时期拍摄的电影(以歌舞电影为主)中的知名片段,当时美国知名的电影演员几乎悉数登场,朱迪加兰也不例外,她的女儿以旁白介绍了她出演的作品。 当年强势无比风光的米高梅公司,推出了一个又一个的奇迹:乱世佳人,猫和老鼠,007,奥斯卡。。如今居然资不抵债,面临倒闭的命运。只是它掌控将近 4000 部作品的版权,但这些作品价值几何,还是个未知数。 参考: http://blog.sina.com.cn/s/blog_4a259ff10100dhso.html http://zh.wikipedia.org/w/index.php?title=%E7%9F%B3%E5%A2%99%E9%AA%9A%E4%B9%B1&variant=zh-cn

Posted in 电影世界 | Comments Off

Nginx 接收连接的过程

ngx_event_process_init 会根据最大的连接数目 N 来初始化 free_connections,还会初始化 N 个 write_event 和 N 个 read_event,每个连接的 read 事件则指向对应的 read_event,write 则指向 write_event,这些 read_event 和 write_event 的 handler 是 ngx_http_request_handler;而反过来,这些 read_event 和 write_event 的 data 则指向被分配的 connection; 然后用 ngx_get_connection 函数从监听的描述符的可用的连接中选出一个 ngx_connection_t(看 ngx_connection.c 中的 ngx_get_connection 函数),添加一个可读事件以及处理函数 ngx_event_accept。 … Continue reading

Posted in Nginx, 系统编程 | Comments Off

Nginx 事件通知与定时器

Nginx 支持多种事件通知机制,从 select 到 epoll,kquene 之类。 src/event/modules 目录中定义了各个机制的具体实现,在编译时只会有一个被编译进去,这取决于选择哪个事件机制了。 从上层看,它们都被抽象为 ngx_event_module_t 类型。 在 ngx_event.c 中的 ngx_event_process_init 会对选择的事件机制初始化,对 epoll 而言,实际就是调用的 ngx_epoll_init 来对 epoll 做初始化。 并会加上 flag:NGX_USE_CLEAR_EVENT。 对于 UDP,ngx_event_t 的写事件的 ready 总是准备好的(ready = 1)。 而 ngx_event_t 的 active 则表明事件是否是活跃的:参考 ngx_epoll_add_event 中添加事件的处理方式,这涉及到是 EPOLL_CTL_MOD 还是 … Continue reading

Posted in Nginx, 系统编程 | 1 Comment

C 语言中自定义格式化串

先复习一下可变参数与 # 和 ## 表示的含义。 http://hi.baidu.com/xliuchen/blog/item/f7913f01a379d404728da561.html 某些时候可能需要自定义格式化串。 ngx_string.c 中的 ngx_slprintf 和 ngx_vslprintf 等函数让你可以在 printf 之类函数中自定义你可以的格式化串。

Posted in 数据结构与算法 | Comments Off

Slab 原理与 Nginx 应用

slab 好像被提到的很多,特别是在 Linux 内核和 memcached 中,在这里找个机会把它了解一下。Linux 内核太复杂了。 目前 Nginx 中的 slab 好像被用在内存的限制上,主要是 HTTP Limit Zone 和 HTTP Limit Requests 模块中,以限制对内存的使用。 1、初始化 主要是在 ngx_slab_pool_t 中对 pool 的初始化。沿着 pool 指向的地址开始进行分配。 首先是一个 ngx_slab_pool_t 的结构体;然后是一个有很多槽(slot)的数组,分配内存时,根据要分配的大小决定 slot 的值,还有一个 shifit,shift 在代码中将被频繁用到,它们之间的关系是: slot size shift 0 pages … Continue reading

Posted in Nginx, 数据结构与算法 | Comments Off