早上八点十分,艾瑞克推开凌云办公室的门时,凌云已经站在白板前。
白板上贴了三张列印纸,左边一张是昨天董事会通过的项目提案封面,中间一张画著粗略的分层架构图,右边一张是空白的日程表。白板本身用黑色马克笔写了几个词:事件驱动、异步、非阻塞。
“早。”艾瑞克说,手里拿著笔记本和一支万宝龙钢笔。
“早。”凌云没回头,继续在白板上画一个流程图。箭头方框,连接线笔直。画完最后一笔,他才转身,从桌上拿起两份装订好的文件,递一份给艾瑞克。
文件封面写著:“项目代號 nexus – 技术架构 v0.1”。
“坐。”凌云指向办公桌对面的椅子。
艾瑞克坐下,翻开文件。第一页是目录:架构概览、核心模块、性能指標、开发阶段、团队组成。他快速翻到架构概览,眼睛扫过那些图表。
凌云走到白板前,敲了敲中间那张架构图。
“昨天董事会通过了,”他说,“现在进入执行阶段。你是技术负责人。”
艾瑞克点头,没抬头,还在看文件。
“有问题现在问。”凌云说。
艾瑞克翻到性能指標页,手指点在一行数字上:“五万並发连接。测试环境怎么模擬?”
“租用机房,”凌云说,“找isp拉专线,用脚本模擬连接。初期测试可以降低標准,但最终验收必须达到。”
“內存占用,”艾瑞克继续,“每个连接不超过10kb。apache现在平均是150kb。十倍差距。怎么做到?”
“连接池復用,”凌云走到白板前,在空白处画了个简单的內存布局,“不每个连接单独分配完整结构体,用共享內存区域,工作进程通过指针引用。事件通知用epoll,避免频繁上下文切换。”
艾瑞克在笔记本上记下几个词:连接池、共享內存、epoll。他抬头:“epoll是linux特有的。freebsd用kqueue,solaris用/dev/poll。我们要做多平台支持?”
“项目只支持星辰系统,”凌云说,“优先保证我们的生態,其他平台后续考虑。”
“內核需要改多少?”
“不多。”凌云走回办公桌,从抽屉里拿出一叠列印纸,上面是手绘的內核调用图,“主要在网络栈,优化tcp连接建立和关闭的路径,减少锁竞爭。还有事件通知机制的封装,提供统一api。”
艾瑞克接过那叠纸,翻看。图上標註了函数名和参数,有些地方用红笔圈出,写了优化建议。他看了两分钟,然后放下。
“时间表,”他说,“三个月出可用版本。按这个复杂度,至少需要十五个全职工程师。我现在团队抽不出这么多人。”
“新招。”凌云从桌上拿起另一份文件,是猎头公司提供的候选人名单,“已经让马克联繫了。下周一安排面试,你主面。”
艾瑞克看了眼名单,大约二十个人,来自sun、ibm、网景,甚至有一个来自微软的iis团队。他抬眉:“能挖动?”
“钱给够。”凌云说,“项目优先级最高,预算充足。”
艾瑞克合上文件,身体往后靠了靠:“项目目標清楚了。但我想知道,为什么是现在?apache还能撑一段时间。我们完全可以等市场更成熟再介入。”
凌云没有马上回答。他走到窗前,拉开百叶窗。
“星际爭霸,”凌云说,背对著艾瑞克,“昨天一天,星火网咖的伺服器日誌显示,apache崩溃了三次。高峰期在线一万两千人,响应延迟超过两秒。”
艾瑞克没说话。
“星语即时通信,”凌云继续说,“上周用户突破六十万。我们的后台用apache搭的,现在每晚上线高峰,cpu就飆到90%。运维半夜被叫起来重启。”
他转过身,走回白板前,用红笔在“五万並发连接”下面划了一道横线。
“需求不是未来式,”凌云说,“是现在进行时。暴雪下周要找我们谈战网扩容,雅虎那边也在问,他们的新闻站点能不能用我们的方案。市场在等,但我们没產品。”
艾瑞克沉默了几秒,然后点头:“明白了。”
他打开笔记本新的一页,写下日期:1997年12月12日。然后抬头:“架构我基本同意。但有个技术点要確认——你写的『主进程-工作进程模型』,工作进程之间完全独立?”
“对。”
“那共享配置怎么同步?如果运行时修改配置,难道每个工作进程都重新解析一遍?”
“主进程负责配置解析,”凌云走回白板,在架构图旁边画了一个简单的进程关係图,“工作进程启动时,从主进程继承配置。热更新时,主进程重新解析配置,然后通知工作进程逐步重启。旧进程处理完现有连接后再退出,新进程用新配置。”
“平滑重启。”
“对。”
“信號机制?”
“sighup触发重载,sigterm优雅关闭,sigquit快速关闭。”
艾瑞克快速记录。他的笔跡工整,每个技术点都编號。“內存管理模块,”他边写边说,“需要专门的人。內核组抽不出。”
“新招的人里有一个专攻內存优化,”凌云说,“从ibm来的,以前做资料库缓存层,面试时你重点问。”
“好。”
白板上贴了三张列印纸,左边一张是昨天董事会通过的项目提案封面,中间一张画著粗略的分层架构图,右边一张是空白的日程表。白板本身用黑色马克笔写了几个词:事件驱动、异步、非阻塞。
“早。”艾瑞克说,手里拿著笔记本和一支万宝龙钢笔。
“早。”凌云没回头,继续在白板上画一个流程图。箭头方框,连接线笔直。画完最后一笔,他才转身,从桌上拿起两份装订好的文件,递一份给艾瑞克。
文件封面写著:“项目代號 nexus – 技术架构 v0.1”。
“坐。”凌云指向办公桌对面的椅子。
艾瑞克坐下,翻开文件。第一页是目录:架构概览、核心模块、性能指標、开发阶段、团队组成。他快速翻到架构概览,眼睛扫过那些图表。
凌云走到白板前,敲了敲中间那张架构图。
“昨天董事会通过了,”他说,“现在进入执行阶段。你是技术负责人。”
艾瑞克点头,没抬头,还在看文件。
“有问题现在问。”凌云说。
艾瑞克翻到性能指標页,手指点在一行数字上:“五万並发连接。测试环境怎么模擬?”
“租用机房,”凌云说,“找isp拉专线,用脚本模擬连接。初期测试可以降低標准,但最终验收必须达到。”
“內存占用,”艾瑞克继续,“每个连接不超过10kb。apache现在平均是150kb。十倍差距。怎么做到?”
“连接池復用,”凌云走到白板前,在空白处画了个简单的內存布局,“不每个连接单独分配完整结构体,用共享內存区域,工作进程通过指针引用。事件通知用epoll,避免频繁上下文切换。”
艾瑞克在笔记本上记下几个词:连接池、共享內存、epoll。他抬头:“epoll是linux特有的。freebsd用kqueue,solaris用/dev/poll。我们要做多平台支持?”
“项目只支持星辰系统,”凌云说,“优先保证我们的生態,其他平台后续考虑。”
“內核需要改多少?”
“不多。”凌云走回办公桌,从抽屉里拿出一叠列印纸,上面是手绘的內核调用图,“主要在网络栈,优化tcp连接建立和关闭的路径,减少锁竞爭。还有事件通知机制的封装,提供统一api。”
艾瑞克接过那叠纸,翻看。图上標註了函数名和参数,有些地方用红笔圈出,写了优化建议。他看了两分钟,然后放下。
“时间表,”他说,“三个月出可用版本。按这个复杂度,至少需要十五个全职工程师。我现在团队抽不出这么多人。”
“新招。”凌云从桌上拿起另一份文件,是猎头公司提供的候选人名单,“已经让马克联繫了。下周一安排面试,你主面。”
艾瑞克看了眼名单,大约二十个人,来自sun、ibm、网景,甚至有一个来自微软的iis团队。他抬眉:“能挖动?”
“钱给够。”凌云说,“项目优先级最高,预算充足。”
艾瑞克合上文件,身体往后靠了靠:“项目目標清楚了。但我想知道,为什么是现在?apache还能撑一段时间。我们完全可以等市场更成熟再介入。”
凌云没有马上回答。他走到窗前,拉开百叶窗。
“星际爭霸,”凌云说,背对著艾瑞克,“昨天一天,星火网咖的伺服器日誌显示,apache崩溃了三次。高峰期在线一万两千人,响应延迟超过两秒。”
艾瑞克没说话。
“星语即时通信,”凌云继续说,“上周用户突破六十万。我们的后台用apache搭的,现在每晚上线高峰,cpu就飆到90%。运维半夜被叫起来重启。”
他转过身,走回白板前,用红笔在“五万並发连接”下面划了一道横线。
“需求不是未来式,”凌云说,“是现在进行时。暴雪下周要找我们谈战网扩容,雅虎那边也在问,他们的新闻站点能不能用我们的方案。市场在等,但我们没產品。”
艾瑞克沉默了几秒,然后点头:“明白了。”
他打开笔记本新的一页,写下日期:1997年12月12日。然后抬头:“架构我基本同意。但有个技术点要確认——你写的『主进程-工作进程模型』,工作进程之间完全独立?”
“对。”
“那共享配置怎么同步?如果运行时修改配置,难道每个工作进程都重新解析一遍?”
“主进程负责配置解析,”凌云走回白板,在架构图旁边画了一个简单的进程关係图,“工作进程启动时,从主进程继承配置。热更新时,主进程重新解析配置,然后通知工作进程逐步重启。旧进程处理完现有连接后再退出,新进程用新配置。”
“平滑重启。”
“对。”
“信號机制?”
“sighup触发重载,sigterm优雅关闭,sigquit快速关闭。”
艾瑞克快速记录。他的笔跡工整,每个技术点都编號。“內存管理模块,”他边写边说,“需要专门的人。內核组抽不出。”
“新招的人里有一个专攻內存优化,”凌云说,“从ibm来的,以前做资料库缓存层,面试时你重点问。”
“好。”
