IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者
首页 / UC技术博客
IT 2014-12-02 23:41:12 / 累计浏览 6,700

[译]Google Chrome中的高性能网络

这篇讲的是,即便在拥有V8引擎和WebKit渲染这两大“加速器”的今天,Chrome为何仍将网络性能优化视为重中之重。文章从一个核心矛盾出发:现代网页平均加载1280KB数据、88个资源,并分散在15个以上的主机上,这些短促而爆发的请求与TCP针对大文件传输的设计初衷并不匹配。 作者深入剖析了Chrome的多进程网络架构,并将一个资源请求从诞生到完成的生命周期拆解开来。你会看到,浏览器在发出请求前是如何绞尽脑汁复用已有连接、检查DNS缓存,甚至预判网站拓扑进行预先连接的。文章强调,如果网络不畅,所有前端优化都将事倍功半,因此Chrome网络模块的许多努力(如智能缓存、连接池管理)其实都发生在用户察觉不到的幕后。 它为前端和浏览器开发者提供了一个清晰的视角,理解浏览器这个“平台”是如何在底层与网络延迟和复杂度对抗的,最终目标就是让那些“巧妇难为无米之炊”的等待时间无限趋近于零。

本机暂存
IT 2014-12-02 23:39:25 / 累计浏览 6,540

实时监控Android设备网络封包

这篇讲的是如何让Android设备的网络抓包变得像直接在电脑上用Wireshark一样实时。作者从传统流程(先用tcpdump抓包存文件,再传回PC分析)的繁琐出发,提出了一种更高效的方案。 核心原理很巧妙:利用tcpdump生成标准libpcap格式数据,通过管道实时重定向到一个网络端口,然后在电脑端用netcat工具接收数据流,最终直接喂给Wireshark进行解析。整个过程只需在设备上执行一条包含tcpdump和netcat的指令,并在主机上设置端口转发和Wireshark读取命令即可完成。 文章具体给出了关键命令,包括需要root权限执行的部分,以及对端口设置的提醒。对于不同系统(如Mac)可能需要的额外权限(sudo)也有提及。这种方法实现了近乎实时的网络流量监控,省去了文件中转的步骤,为Android网络调试提供了更直接、高效的工具链思路。

本机暂存
IT 2014-12-02 23:38:18 / 累计浏览 1,460

高性能Android Canvas游戏开发

这篇讲的是如何在Android平台的移动浏览器上,为Canvas游戏开发榨取极致渲染性能。文章核心观点是:性能优化的关键,在于理解并利用Android Canvas独特的硬件加速机制——它与iOS的实现原理有根本区别。 作者首先点明,移动设备性能往往只有桌面端的十分之一,优化至关重要。但直接套用iOS的优化方案(如大量使用Off-Screen Canvas进行缓存)在Android上会适得其反。原因在于,iOS依赖IOSurface进行高效的GPU位拷贝,而Android的硬件加速Canvas底层是一个GL Texture,频繁创建多个小Canvas会造成显存碎片化,且GPU上下文切换开销巨大。 因此,文章提出了明确的优化规则:第一,必须针对Android而非iOS的机制进行优化;第二,保持网页DOM树尽可能简单,以将系统资源更多留给Canvas渲染。这些规则均建立在对底层渲染架构差异的深刻剖析之上,为开发者提供了具体、可操作的高性能Android Canvas游戏开发指南。

本机暂存
IT 2014-11-28 23:03:09 / 累计浏览 2,320

初探Thrift客户端异步模式

这篇讲的是如何为Thrift RPC框架引入异步调用能力。作者从团队广泛使用的同步模式出发,为优化大数据量传输等场景,探索了Thrift原生提供的异步客户端方案。 核心实现围绕生成的异步客户端类与`TAsyncChannel`接口展开。`TAsyncChannel`定义了异步收发消息的接口,目前标准的实现是基于libevent和HTTP协议的`TEvhttpClientChannel`。它的巧妙之处在于,通过将回调函数注册到事件循环中,使得客户端发送请求后无需阻塞等待,可以继续执行其他任务,待服务端响应到达时再触发回调处理结果。 文中一个关键发现是:异步客户端并非必须搭配异步服务器。通过实验验证,只要服务器端使用HTTP传输层(例如通过`THttpServerTransportFactory`),协议层保持一致,即可与异步客户端正常工作。这大大降低了现有同步服务的改造成本。 实验部分展示了一个完整的异步客户端与同步服务器交互的例子,运行结果证实了调用发起与响应接收在时间上是解耦的。不过,作者也指出当前实现限于HTTP传输层,这为后续扩展其他传输协议留下了探索空间。

本机暂存
IT 2014-11-28 22:59:58 / 累计浏览 2,640

分布式对象存储系统Sheepdog性能测试

这篇文章对分布式对象存储系统 Sheepdog 进行了一次详尽的性能摸底,特别针对其声称的“零配置、线性扩展”特点,在真实硬件环境下考察了其 IOPS 和吞吐量表现。作者搭建了一个包含 6 个节点的集群,节点配备常见的 7200 转 SATA 硬盘,并创新地利用 SSD 作为对象缓存,虚拟机则运行于基于 KVM 的 QEMU 环境中。 测试聚焦于两个核心指标:使用 fio 工具测量的随机读写 IOPS,以及使用 iozone 测量的顺序读写吞吐量。文章首先澄清了存储介质的基准性能——普通 SATA 硬盘的 IOPS 理论上限仅约 65,而 SSD 则可轻松突破数万。在不启用对象缓存的只读测试中,Sheepdog 展现了其分布式优势:6 节点协同工作,使得虚拟机内的 IOPS 突破了单块 SATA 硬盘的极限,在单线程下达到 100 左右,多任务或异步 IO 场景下更可提升至 230-250。测试文件大小对 IOPS 有显著影响,缩小文件范围能进一步提升性能。 作者通过严谨的控制变量法,对比了启用/不启用 SSD 缓存、不同文件大小以及不同 IO 调度算法下的结果。最终的测试数据清晰地揭示了 Sheepdog 在不同配置下的性能天花板和瓶颈所在,为评估其是否适合特定业务负载(如虚拟机块存储)提供了直接的量化依据。

本机暂存
IT 2014-11-28 22:39:58 / 累计浏览 1,760

FastDFS使用经验分享

这篇讲的是FastDFS在实际使用中遇到的两个痛点,并给出了经过验证的解决方案。第一个问题是文件下载时显示的哈希文件名对用户不友好。作者从存储机制分析,指出FastDFS本身不保留原始文件名,核心解决方法是结合应用数据库与Nginx:上传时记录FID与原始文件名,下载时在URL中通过`attname`参数携带原始文件名,再利用Nginx配置拦截该参数,写入响应头的`Content-Disposition`字段,从而让浏览器展示正确的文件名。 第二个经验是管理图片的多分辨率备份。作者利用了FastDFS的“主从文件”机制,即主文件与从文件仅在ID上有关联(从文件ID包含主文件ID),服务端并不维护其关系。通过先上传源图,再以指定主文件ID和后缀名上传缩略图,即可建立关联。文章特别提醒,这种关联是逻辑上的,删除主文件时需要应用层自行处理从文件的清理,避免资源孤立。 两篇分享都聚焦于FastDFS默认功能与实际业务需求之间的 gap,并提供了简单有效的工程化实现路径。

本机暂存
IT 2014-11-28 22:13:57 / 累计浏览 2,940

分布式全文检索系统SolrCloud简介

这篇文章讲解的是面向大规模搜索场景的分布式方案——SolrCloud。作者从Solr的部署演进讲起,指出单机和传统Master-Slaver方式的局限性,而SolrCloud基于Zookeeper实现了真正的分布式协同。 摘要重点突出了它的核心特性:集中式配置管理,让集群配置变更全局生效;自动容错与分片,单个节点故障不影响服务,并能自动重建副本;近实时搜索支持秒级数据可检索;查询时自动负载均衡,可通过横向扩展缓解压力。文章也提到了索引存储于HDFS、通过MapReduce批量建索引等高阶能力,以及强大的RESTful API和管理界面。 最后,文章对Collection、Shard、Replica等核心概念进行了阐释,帮助读者建立清晰模型。整体来看,这是一篇对SolrCloud分布式架构、关键技术点和适用场景的扎实入门介绍。

本机暂存
IT 2013-11-20 00:18:00 / 累计浏览 3,040

数据可视化初体验(R语言)

这篇文章以作者初入数据可视化领域的体验为线索,分享了其核心理解与R语言实践。作者引用“图画最大价值在于迫使我们注意到从未预料到的内容”这一观点,强调可视化不仅是展示数据,更能通过图像残留增强思考,揭示隐藏规律,并以Twitter用户分布图为例加以印证。 在实践部分,作者以中国航空数据为例,展示了如何用R的ggplot包将“实体”与“联系”的逻辑转化为可视化步骤:从用直方图展示机场航线数量,到在地图上叠加点线图呈现地理位置与航线网络,最终生成GIF动画,层层递进。文章还简要提及了基于Knitr包实现可重复自动化统计报告的方法,对比了其相较于传统数据报表的优势。 整篇文章从感性认识到理性实践,结合了数据可视化的哲学思考与R语言的具体实现,为初学者提供了一个清晰的入门框架与案例。

本机暂存
IT 2013-10-29 23:04:41 / 累计浏览 1,940

MooseFS之虚拟机惹的祸

这篇讲的是一个生产环境MooseFS集群的惊险故障复盘。国庆后,一台ChunkServer重启导致Master无响应几十分钟,整个集群瘫痪。排查日志发现,海量的“nonexistent chunk”错误日志打印是罪魁祸首。 作者深入源码分析,发现处理逻辑本身多为内存操作,问题出在单线程的Master进程调用syslog写磁盘这个操作上。通过对比线上和测试环境的TPS数据,性能差异达到惊人的65倍。最终锁定根因:运维此前将Master从物理机迁移到了虚拟机,而虚拟机的系统盘直接挂载在性能较差的网络iSCSI设备上,导致磁盘I/O成为致命瓶颈。 文章不仅给出了直接注释日志代码和迁移回物理机的解决方案,更提炼出关键经验:MooseFS Master的单线程架构对磁盘I/O极其敏感,一旦涉及磁盘写入就可能成为性能瓶颈,因此强烈不建议将其部署在虚拟机环境。作者还结合HDFS对比,指出了单线程设计在高并发场景下的局限性,为存储选型提供了直观参考。

本机暂存
IT 2013-10-29 23:04:06 / 累计浏览 1,600

解决HDFS磁盘扫描导致死亡结点的问题

这篇讲的是作者在升级Hadoop至2.0后,处理的一个棘手的生产故障:集群中磁盘数量多的DataNode会周期性地变为“死亡结点”,虽未立刻影响业务,但一次双副本DataNode同时死亡导致了数据丢失。 问题排查的关键突破口在于“6小时”这个固定间隔。作者将它锁定为DataNode的周期性磁盘扫描任务,并通过jstack抓取堆栈发现了隐蔽的根因:在扫描过程中,数据块对比的步骤需要对核心的DataSet对象加锁,而该步骤中一个看似无害的`File.length()`方法调用,在底层会执行磁盘IO操作。在磁盘压力较大时,这个操作会耗时很长,导致DataSet锁被长时间持有,进而阻塞了心跳线程和所有数据传输线程,造成DataNode被NameNode误判为死亡。 解决方法巧妙且高效:将引发IO操作的`getlength`提前到第二步异步的磁盘扫描任务中执行,从而将持锁时间从几十分钟大幅缩短至2秒左右。文章完整还原了从现象观察、假设推翻到利用工具(jstack)锁定真凶的全过程,对理解分布式系统中锁竞争、IO影响以及复杂故障排查思路很有启发。最终,他们将修复补丁提交至了Apache社区(HDFS-5341)。

本机暂存
IT 2013-10-08 12:38:25 / 累计浏览 2,340

在LVS上实现SNAT网关

这篇技术文章详细记录了作者为LVS负载均衡器添加SNAT网关功能的实战过程。目标很明确:让LVS在承担4层反向代理的同时,还能为内网机器提供访问外网的能力。 作者先分析了常规方案的局限——使用iptables虽能实现SNAT,但会严重影响LVS性能。因此,他决定直接修改LVS源代码。文章核心梳理了两种实现路径:一是修复小米已有的dsnat项目,使其兼容NAT和FULLNAT转发模式;二是在官方内核的NAT模式上,以最小改动直接添加SNAT功能,无需依赖额外的FULLNAT补丁。 实现过程颇具细节:从获取内核源码、打补丁、编译调试,到使用tcpdump抓包分析,作者逐步解决了dsnat与原生NAT的兼容性bug,以及其与FULLNAT的配置冲突。最终产出的补丁和配置示例,为有类似需求的读者提供了可直接参考的完整方案。文章也坦诚指出了当前实现的局限,如暂不支持ICMP协议转发。

本机暂存
IT 2013-09-25 22:55:33 / 累计浏览 7,460

Storm:最火的流式处理框架

这篇讲的是Storm这个实时流处理框架为何能走红,以及它到底能解决什么问题。作者从Hadoop批处理延迟大的痛点切入,引出了Storm诞生的背景——专为低延迟的实时计算而生。文章拆解了Storm的核心卖点:它是一个分布式、高容错的系统,通过Topology(由Spout和Bolt构成)来处理数据流,并依赖Zookeeper进行状态管理,部署和横向扩展都相对简单。 摘要还梳理了Storm的实际应用情况,比如被淘宝、百度、Twitter等大公司用于实时用户画像分析或网站性能监控,以及它如何在迭代中加入Trident等新特性来解决重复计数等实际问题。最后,文章将Storm与Spark Streaming、HStreaming等竞争对手做了简单对比,并指出Storm虽然不是一个“开箱即用”的完整方案,但一旦解决好消息队列和状态管理等前置问题,其简单可扩展的架构优势就会显现出来。

本机暂存
IT 2013-09-15 22:40:29 / 累计浏览 4,240

Spark:一个高效的分布式计算系统

这篇讲的是Spark这个基于内存的分布式计算框架,作者从Spark与Hadoop的对比出发,深入介绍了其核心优势和关键特性。文章指出,Spark通过将中间结果保存在内存中,避免了Hadoop MapReduce频繁读写HDFS的瓶颈,从而在迭代运算密集的数据挖掘与机器学习任务中效率显著提升。 其核心创新在于RDD(弹性分布式数据集)的抽象,它使得开发者能以操作本地集合的方式来处理分布式数据,支持丰富多样的转换和行动操作,编程模型比Hadoop的Map和Reduce更加灵活。文章还剖析了RDD的存储、分区、容错机制(通过血缘信息和检查点)及其11种存储级别,这些共同构成了Spark高效、可靠的基础。 此外,文章梳理了Spark的生态系统,包括兼容Hive的Shark、用于流处理的Spark Streaming以及图计算框架Bagel,并列举了其多种运行模式与在业界的早期应用。总体而言,Spark并非Hadoop的替代品,而是一个更通用、更适合迭代计算的补充,它直接读写HDFS并支持在YARN上运行,为处理海量数据提供了新的高效选择。

本机暂存
IT 2013-09-15 22:37:57 / 累计浏览 1,020

以keystore方式为play!应用建立单向/双向SSL

这篇讲的是如何在Play!框架中配置SSL安全连接,而且特别澄清了官方文档的不足之处,避免读者被过时资料误导。 作者先理清了SSL的核心:用对称加密传输数据,非对称加密(RSA)安全传递密钥。在此基础上,解释了单向SSL(服务端验证)和双向SSL(服务端与客户端互相验证)的区别,后者适用于需要严格控制访问权限的内部服务。 配置的关键在于正确设置keystore。文章详细演示了生成服务端密钥库(certificate.jks)的命令,并特别指出密钥库口令与密钥口令必须一致这个容易忽略的坑。对于单向SSL,配置到此即可。 如果需要双向SSL,流程还涉及在客户端生成并导出证书,然后将该证书导入服务端的密钥库进行“授信”。整个过程通过具体的keytool和openssl命令逐步拆解,甚至涵盖了使用curl和浏览器进行测试的不同方法,非常实操。 文章用清晰的步骤,把Play!应用如何建立从单向到双向的SSL连接,从原理到命令都讲透了。

本机暂存
IT 2013-08-21 13:26:08 / 累计浏览 4,840

Linux内核协议栈对于timewait状态的处理

这篇文章从一次生产环境的运维问题切入,详细剖析了Linux内核从2.6.18升级到2.6.32后,系统TIME_WAIT状态连接数显著增多的根因。作者的核心工作是对两个版本内核的代码进行diff,精准定位到了`net/ipv4/inet_timewait_sock.c`文件中的一处关键变更。 问题的核心在于`inet_twdr_hangman`函数里,一行负责轮转回收槽位的代码`twdr->slot = ...`的位置被移动了。在旧版本中,无论当前槽位(slot)的timewait块是否被完全清理,该自增操作都会执行;而在新版本中,它被放入了一个条件分支,仅当当前槽位被成功清空时才执行。这个看似微小的时序调整,改变了内核回收timewait块的调度逻辑,最终导致了回收变慢和积压。 文章不仅给出了结论,更通过分析`inet_timewait_death_row`数据结构与`inet_twdr_hangman`的定时回收机制,完整还原了问题发生的底层路径。对于需要理解TCP连接生命周期管理,或是面临类似内核升级后网络连接数异常的工程师来说,这篇深入源码实现的排障手记提供了非常具体的思路和技术细节。

本机暂存
IT 2013-08-21 13:24:10 / 累计浏览 2,240

[译文]关于移动Web性能的5个神话

Sencha的CEO Michael Mullany撰文回应了此前引发热议的“移动Web应用为何慢”一文,他指出该文数据虽基本正确,但解读存在偏差且忽略了更关键的图形性能。文章系统驳斥了五个关于移动Web性能的常见误解。 首先,移动Web性能瓶颈主要在于浏览器渲染优化、DOM操作和GPU加速,而非JavaScript本身。其次,过去四年超过50%的JavaScript性能提升源于软件优化,而非单纯依赖硬件升级。再者,移动浏览器性能远未停滞,不同浏览器在各自领域存在10倍以上的差距,优化空间巨大。同时,未来的硬件迭代将通过更快GPU、内存带宽和多线程并行化持续带来性能飞跃。最后,现代浏览器采用的增量垃圾收集机制已大幅改善停顿问题,垃圾回收不再是无法逾越的性能杀手。 作者结合iOS和Android设备长达四年的性能测试数据,展示了JavaScript与DOM操作性能的显著提升,这些进步远超摩尔定律预期。文章强调,优秀的开发者使用现代Web框架能够构建出体验流畅的移动应用,性能的持续进化让开发者对移动Web的未来充满信心。

本机暂存
IT 2013-08-13 13:08:27 / 累计浏览 7,320

Python程序的执行原理

这篇讲的是Python代码从源文件到运行背后的核心机制——字节码与虚拟机如何协同工作。文章从最简单的“Python先把代码编译成字节码”这一概述出发,层层深入,带我们看清了执行过程的每个关键环节。 作者详细拆解了字节码在Python内部的具体形态——PyCodeObject对象,并剖析了其结构体定义,如co_code、co_consts等字段如何承载代码信息。对于开发者日常可能遇到的.pyc文件,文章也理清了它的生成时机(模块import时)与Python的加载更新策略,解开了不少常见疑惑。 文章的精彩之处在于将理论落地到可操作的层面。它展示了如何利用内置的compile函数和dis模块,去实际“解剖”一段代码对应的字节码指令序列,让抽象概念变得可视、可调试。最后,文章将视角拉升到虚拟机执行层面,通过类比X86的栈帧,讲解了Python如何通过PyFrameObject管理函数调用和作用域,完整模拟了一个程序的运行世界。 整篇文章就像一份精心绘制的内部结构蓝图,不仅告诉你Python“怎么做”,更展示了它是“如何做到”的,非常适合希望突破语法层面、理解Python执行本质的开发者。

本机暂存
IT 2013-07-30 13:41:13 / 累计浏览 3,880

开源PHP监控扩展:witness简介

这篇讲的是一个专为PHP环境设计的开源监控扩展——witness。它瞄准的是PHP多进程、多机器部署架构下,难以追踪和排查特定用户请求问题的痛点。当线上出现只影响个别用户的故障时,传统加日志的方式往往效率低下且可能引入新问题。 witness的解决方案巧妙而直接:它作为一个底层扩展嵌入PHP引擎,无需修改业务代码。核心能力在于可以通过设置特定的cookie,对来自目标用户的请求进行精准监控。它提供了两种核心模式:trace模式记录完整的函数调用流,像“拍视频”一样还原过程;dump模式则抓取当前调用栈的详细状态,如同“拍照片”保留瞬间细节。 文章详细介绍了系统的三层架构(扩展、数据传输、数据展示),以及具体的安装、配置步骤。扩展以配置项控制行为,如监控深度、是否记录内置函数等,灵活度很高。数据最终会汇总,便于后续可视化分析。 总的来说,witness提供了一套轻量且高性能的非侵入式方案,让PHP开发者能在复杂分布式环境中,更精准、高效地定位那些“幽灵般”的个别用户问题。项目已在GitHub开源。

本机暂存
IT 2013-07-29 23:14:57 / 累计浏览 2,860

HAProxy几个重要的结构体

这篇讲的是HAProxy高性能代理背后的数据结构“骨架”。作者从上篇的连接建立流程出发,这次深入剖析了几个支撑其运行的核心结构体,尤其是session和task。 对于管理每一次连接的session,文章剥离了HTTP等上层细节,展示了它如何通过嵌入的双向链表节点将所有会话串联起来,形成一个全局列表。对于驱动事件循环的task,讲解则更为深入:它借助了HAProxy自研的ebtree来管理任务队列。通过判断task内部ebtree节点的leaf_p指针是否为空,就能高效地知道一个任务是在等待队列还是运行队列中。文章还贴出了相关的内联函数代码,展示了如何进行队列的添加与删除操作。 整篇文章不泛泛而谈,而是紧扣“如何用简洁数据结构实现高效管理”这条主线。通过精简的结构体定义和队列操作示意,清晰地揭示了HAProxy将连接状态与异步事件调度解耦的设计思想,对于想理解现代网络服务器内部实现的读者来说,是一次扎实的源码解读。

本机暂存
IT 2013-07-29 22:58:09 / 累计浏览 3,180

FUSE源码剖析

这篇讲的是如何通过源码剖析来理解FUSE(用户空间文件系统)的内部工作原理。作者以FUSE-2.9.2版本的代码为基础,没有停留在概念介绍,而是直接切入核心,详细拆解了一个文件写操作在内核与用户空间之间完整往返的8个步骤。 文章清晰地梳理了从应用层发起write系统调用开始,请求如何经由VFS层传递给FUSE内核模块,被放入请求队列并等待,再到用户空间的守护进程轮询获取请求、执行实际操作,最后将结果同步返回内核的整个链条。这个视角生动展示了FUSE作为“桥梁”的实现机制。 为了支撑流程讲解,文章系统地介绍了内核侧与用户侧的关键数据结构,如管理通信连接的fuse\_conn、代表单次请求的fuse\_req等,勾勒出了FUSE框架的数据骨架。此外,文章还剖析了FUSE内核模块的加载注册过程,以及用户态程序通过mount命令将自定义文件系统挂载到内核的流程,从底层揭示了用户态文件系统得以运行的根基。 通过这样自顶向下与自底向上结合的剖析,文章将FUSE看似复杂的跨空间协作,还原为一组清晰的数据结构和函数调用,为理解这类“中间件”的设计思想提供了绝佳范例。

本机暂存