Linux运维趋势_第12期_故障排除
002 《Linux 运维趋势》投稿信箱 : yangsai@51cto.com 杂志订阅 : http://os.51cto.com/art/201011/233915.htm 51CTO Linux 频道 :http://os.51cto.com/linux/ 目录 Index 目录 人物·People 003 天涯首席工程师王建科:技术人要有产品观 交流·Interact 005 网站扩展实例:1亿用户的Tagged架构进化史 八卦·News 007 Linux 20周年庆,2011最佳开源软件 专题·Special 009 strace命令使用实例 010 Unix调试的瑞士军刀:lsof 012 使用top命令的一些小技巧 013 网站排障分析常用的命令 014 MySQL生产环境突发故障处理手册 016 oracle审计导致的系统性能故障 017 数据库故障分析与排查 技巧·工具·脚本 021 Linux管理员常用网络资源收集 022 五款救急的Linux文件恢复软件 024 运维自动化之Cobbler系统安装详解 027 用SHELL脚本来防止SSH和vsftpd暴力破解 出版方 :51CTO 系统频道(北京无忧创想信息技术有限公司) 本期责编 :李晶 杂志主编 :杨赛 联系方法 :yangsai@51cto.com 010-68476606(分机 8035) 出版日期 :2011 年 9 月 16 日 每月第 2 个星期五出版 订阅 :http://os.51cto.com/art/201011/233915.htm 003 《Linux 运维趋势》投稿信箱 : yangsai@51cto.com 杂志订阅 : http://os.51cto.com/art/201011/233915.htm 51CTO Linux 频道 :http://os.51cto.com/linux/ 人物 People 天涯首席工程师王建科:技术人要有产品观 国内的网民们大多听说过天涯社区,只是也许很 多人并不知道,这个有12年历史的、现在同时在线已 经超过50万人的巨大社区,在最开始几年的产品设 计、开发和运维,都是由一个人来完成的。他就是现 在天涯的首席工程师、天涯论坛产品总监王建科。本 次访谈内容大致分为天涯的技术发展历程、天涯界面 的设计、对技术债务的观点、对技术选型的观点、对技 术人员成长的建议、以及开源相关的一些话题。对于 互联网行业的开发、运维和产品运营人员而言,相信 王建科的分享会给你带来一些启发。 51CTO :首先,简单的介绍一下天涯的技术发展历 程吧。 王建科:天涯最初只有一个开发者,就是我。产品 的设计和技术实现都是我。当时是用ASP来做,有 很多困难,因为那时ASP这个技术没有文档,全靠摸 索,不像现在,网上资料非常多。那是在98年底的时 候。 天涯最开始上线运营的话是99年3月1号。我 的ID是2月28号注册的,是天涯第一个ID。回想当 时,其实对技术的要求并不很高,只要把这个东西实 现出来,快速的实现出来。当时整个互联网的网民也 比较少,所以用户比较少,所以对整个性能的压力也 比较小。当然服务器硬件也比较差,大概是586这样 的吧。 51CTO :当时服务器是托管在机房? 王建科:当时我们还没在机房,只有一条链路,好 像也就是几十K吧,马上感觉不够,就搬到电信的机 房去了。当时电信还没有IDC这个概念,也就是一张 桌子,有个网线,连上去就行了(笑)。当时门槛是比 较低的。 我们把天涯分为几个阶段,第一个就是2003年之 前,刚起步的一个阶段。网民比较少,当时网友还是 一个比较异类的人群,ID千奇百怪的,谈的话题别人 都听不懂。所以那个时候,同时在线也就是90人左 右。2002年同时在线是1000人,到2003年的时候, 同时在线就差不多快要10000人了。不过2003年那 时候还是只有一台服务器,又当web又当db,内存只 有512MB,这个压力可想而知。 当时天涯还有一个特点,就是帖子是不分页的。 一千回复也好,一万回复也好,一个页面都要全部加 载进来。长帖对天涯的系统压力非常大。 2003年之后到2006年之间,是天涯发展的一个 中期阶段。这个阶段天涯快速发展,从2003年的同 时在线8000人,到2006年达到20万。快速发展我 觉得有几个原因吧,第一个是大概在2005年左右,中 国互联网快速增长,网民大爆发,天涯用户也跟着往 上增长。还有一个就是当时天涯的媒体性凸显出来, 因为天涯当时很多网络事件和话题,很多媒体就把天 涯作为一个新闻源去报导,这样相当于传播天涯的品 牌。 这样就导致了天涯的快速增长,而天涯的服务器 这时候增长的也比较快…… 51CTO :不再是一台服务器了。 王建科:嗯,不再是一台了。2004年的时候,已经 是4台web,2台db了。之前已经是扛不住了,负载 全都满了这么一个状况。后来我们就拆分嘛,把db 拆分。天涯不是论坛分很多版块吗,所以就是把不同 版块拆分到不同的服务器上。如果是所有版块在一 个表里的话就很难拆分,所以我们就是一个版块对应 一套表。所以如果这个服务器压力比较大的话,我们 就可以把一整个版块,就是一个表,迁移到别的服务 器上去。 所以db方面就是按版块拆分表这个模式。web 方面就是增加。现在web方面扩展比较容易点,最 采访/杨赛 人物简介: 王建科(天涯ID:卓锐),1996年毕业于吉林大学计算机科学 系,现任海南天涯在线网络科技有限公司首席工程师、天涯论坛 产品总监,天涯早期建设者及参与者,主导开发了天涯论坛、天 涯博客等产品。 004 《Linux 运维趋势》投稿信箱 : yangsai@51cto.com 杂志订阅 : http://os.51cto.com/art/201011/233915.htm 51CTO Linux 频道 :http://os.51cto.com/linux/ 人物 People 早做的时候就是通过session会话把web进行拆分。 db另一个方面就是不使用连合查询。天涯最早为 了优化性能有几个特点,一个就是不使用连合查询。 比如有的时候你要呈现用户的名字啊,标题等信息的 时候,就要去读,那么我们的做法是在产生的时候就 把信息写到同一个地方去了,读的时候就只要把它一 起呈现出来。这样表之间就没有太多关联,因为表关 联也是十分影响性能的。而且表关联还会造成难以 拆分的问题。 还有就是一帖到底这个,我们的做法就是把所有 回复写到一个字段里面去。有新的回复时,就把这个 内容插到字段最下面,这样呈现的时候,只要读一个 字段就全出去了。这样就极大的降低了db的I/O, 因为多一次读写就多一次I/O嘛,你只有一个字段, 就只有一个I/O;如果100个回复分为100个字段, 那就是100倍的I/O,1000个就是1000个I/O。所 以天涯把所有回复合并,就极大的减少了I/O。所以 天涯才能大体做到“一帖到底”,不分页。 另一个有关这个分页。很多论坛数据量很大的时 候,你越往后翻页,处理的速度就越慢,效果很差了。 所以天涯这边我们用where子句来分页。Where子 句就是判断,你点下一页的时候,用where子句定位 到这个下一页的数据。所以这样的话,你每次点下一 页,每次请求在性能上的消耗都是一样的,一致的。 51CTO :就不用做 n 次计算了。 王建科:对,就不用再去计算我下一页这个数据到 底在什么位置,尤其数据量大的时候,这就很快。当 然天涯只提供了下一页的功能,而没有提供直接到某 一页的功能,就只能一页一页翻这样。 另一个就是锁。很多网站采用了死锁这种机制, 但是天涯呢,因为网友看内容对一致性的要求并不 高,我们就都全部允许脏读。就是说你不用忽略这个 更新,不用在读的时候把它锁上这样。 51CTO :因为没这个需要。 王建科:对,没必要。因为我们的数据不像银行数 据,对一致性要求并不特别高,就避免了死锁这样的 方式。 另外一方面就是我们也用了DNS轮询,但是DNS 轮询这个效果并不是特别好,没有我们想象的那么均 匀,所以后来我们就自己写了应用来控制负载均衡。 另一个就是在2003年后来压力大的时候,我们开 始用Squid做页面缓存。当时因为天涯很多动态的 内容,变化比较大,而用了页面缓存之后,命中率在 70左右吧,还不错,减少了后端的很多压力。 这样就是2003年到06年这个阶段。 那么07年到现在呢,就是比较强调架构化这个方 面。07年之前我们不是只有电信这么一个链路吗, 网通用户就抱怨很多,所以就购买了网通链路,然后 用F5做链路负载均衡。 然后就是做更多的页面缓存。Squid之后我们开 始用Varnish,这个感觉效果更好一些。然后就是对 页面进行压缩。因为天涯都是文本内容嘛,所以压 缩率能达到70%,效果挺好。然后就是memcached 内存缓存,就是你要往db读写的内容都先放在 memcached里面,这个命中率比较高,有90%。 所以就是一步一步做过来,先解决网通用户的抱 怨,再整个做优化。 51CTO :您对技术人员在中国的发展有何看法? 王建科:在中国的话,技术人员在大企业成长的空 间会更大一点,在中小企业的成长空间就会小一点, 这是中国技术人员面临的一个问题。 51CTO :意思是中国的技术人员还是尽量在大企业 寻求发展是吗(笑)? 王建科:这个嘛(笑),比如像我的话,其实从一开 始就是同时做技术和产品两条线。很多技术人员要 往产品的方向转,觉得有很大困难,但是我这边就要 求,技术人员也必须关注一些产品,因为接触过产品 的技术人员思考交流的方式跟没接触过产品的技术 人员是不一样的。他能够考虑到一个产品使用会不 会有问题,技术特点方面能不能作出更漂亮的功能。 像是国外很多互联网产品都是技术人员驱动的,好比 Google这样的。那么我也会鼓励我们的技术人员,多 关注产品,参与一些决策。否则的话,现在很多公司 一个常态就是,运营人员埋怨产品,然后技术就成了 推脱责任的借口,我们叫做“炮灰”(笑),很辛苦,又 没有成就感。这是不利的,所以就想怎么把这部分和 运营团队糅合在一起,共同做一件事情,共同关注用 户。 这是知识面方面。另一方面技术人员也要扩展一 下深度,还是要走专业化的路线。所以我们也鼓励技 术人员进行交流,好比刘天斯,就很喜欢写博客分享 一些东西,这个过程也学到很多东西。 本文有删节,完整内容见原文: http://os.51cto.com/art/201104/254678.htm 005 《Linux 运维趋势》投稿信箱 : yangsai@51cto.com 杂志订阅 : http://os.51cto.com/art/201011/233915.htm 51CTO Linux 频道 :http://os.51cto.com/linux/ 交流 Interact 网站扩展实例:1亿用户的Tagged架构进化史 一家2004年创建的试水社交网站,经过7年的成长和扩展,现在已经拥有了1亿用户。平均50亿次的pv,承 担在1000多台服务器的网站架构上。Tagged网站,现在承载了1亿个用户、1千台服务器和50亿次页面浏览量。 这个过程是如何实现的? 本文将要介绍的就是这个叫Tagged的网站—— Tagged架构实例:1亿个用户、1千台服务器和50亿 次页面浏览量。下面,Tagged的CTO兼联合创始人 Johann Schleier-Smith 将为我们介绍Tagged网站 架构的成长历程。 自2004年以来,Tagged从一家试水社交领域的 小不点网站,逐渐变成全球最大的社交网络之一,数 百万的成员访问该网站以结交新成员,每个月的页面 浏览量达到50亿次。这个逐步发展的历程迫使我们 Tagged不断完善网站架构,最终获得了功能异常强 大的平台。 第一个阶段:2004年,PHP Web应用程序、10万个 用户和15台服务器 孵化器有着一种快速成型文化:每年通常推出两 个新概念,寻觅其中的大赢家。正是在这样的文化中, Tagged 应运而生。LAMP是适合这种类型的工作的 自然选择;这种工作注重灵活性和快速开发周期。当 时,Java开发主要面向大企业的开发工作,Python吸 引的编程员寥寥无几,Perl方面的编程员又不是我们 所要的那一种。我们还知道,雅虎是PHP的大力支持 者;所以一旦有需要,完全有可能扩展业务规模。 我在以前的项目上运行MySQL方面有着丰富的 经历,这让我对这项技术爱恨交加。本着尝试的精神, 我们为Tagged购买了几份入门级Oracle许可证,看 看甲骨文的技术是不是用起来更好。 值得注意的是,许多构建的小型网站仍然就像早 期的Tagged。具有一种简单的美;无状态的PHP与 有状态的Oracle之间的双向分离正是一台服务器中 最棘手的部分,而额外的Web显示计算能力很容易 添加。 第二个阶段:2005年,缓存PHP Web应用程序、100 万个用户和20台服务器 即使只有在8台服务器的时候,Tagged的网站流 量也要比大多数人所知道的来得多。幸运的是,分布 式内存缓存系统memcached带来了两个优势:既消 除了90%以上的数据库读操作,又确保含有大量不 同信息的社交网络面面可以迅速显示。 自一开始,我们的对象缓存注重显式缓存更新,支 持更简单的技术,比如删除无效的键;或者根据计时 器,使失效数据无效。这种方法的缺点是代码比较复 杂,但大幅减轻了数据库负载,而且使网站保持快速 运行,涉及经常更新的对象时更是如此。 我们的网站继续越来越复杂,在标准的社交网络 功能的基础上,添加了搜索和社交发现等功能。我的 团队说服我使用Java来建立搜索功能,那样我们就 能得益于Lucene库。当我们学会了让Java顺畅运行 后,我有一种如释重负的感觉。 第三个阶段:2006年,数据库扩展、1000万个用户 和100台服务器 文/Todd Hoff 编译/布加迪 006 《Linux 运维趋势》投稿信箱 : yangsai@51cto.com 杂志订阅 : http://os.51cto.com/art/201011/233915.htm 51CTO Linux 频道 :http://os.51cto.com/linux/ 交流 Interact 此时Tagged已拥有1000万个注册用户,随时都 有成千上万个用户在线,我们开始着手解决我一直忧 心忡忡的挑战。那时我们刚筹集到了一笔资金,竭力 寻求发展,但是数据库亟需添加容量。我们进行了一 次又一次的缓存或SQL调整和优化,但服务器的处 理器其占用率还是会一再逼近100%大关。 向上扩展系统的想法是个权宜之计,但是多插槽 服务器硬件动辄数百万美元,于是我们选择了Oracle 真正应用集群RAC,该系统让我们可以使用标准网 络系统来连接数量众多的大众化Linux主机,以构建 一个庞大的数据库。再结合最新处理器具有的优势, Oracle RAC的容量比我们的第一台数据库服务器足 足增加了20倍,这一点很重要,而且允许应用程序开 发人员可以继续致力于开发新的功能特性。 Tagged通过结合来自一个庞大内存中数据集 的统计数字,开始提供个性化的人员匹配(people- matching)推荐服务。用PHP实现这一点完全不现实, 于是Java进一步渗透到了我们的环境中。 第四个阶段:2007年,数据库拆分、5000万个用户 和500台服务器 拆分数据库是最具有难度的任务,也是在扩展 Tagged方面最具有成效的技术。由于在多个数据库 之间分割用户,我们最终拥有了这种设计:在所有地 方都允许我们只要添加硬件,就可以进行扩展。 我们Tagged的一条规定是,将每个表分成64个 分区;我们牢牢遵守这个不成文的规定,除非有着非 常诱人的理由才允许有例外。只有得益于游戏玩家 之间高性能受保护事务的某些游戏才在单独的数据 库中垂直分区。 拆分现有的数据意味着针对数TB的数据进行复 杂的转换工作。一开始,我们每次逐个着手解决功能 特性,依赖应用程序代码来代替连接(join),但最后 我们还是在应用程序的核心部分遇到了一大批表,这 些表的结合得太紧密了,这个方法行不通。于是我们 编写了生成SQL的迁移代码,导出、转换和重新装入 了数亿行的数据,并使用触发器来跟踪源系统上面出 现的变化,逐渐更新目标,那样最后的同步所带来的 停运时间不到30分钟。 拥有许多数据库意味着拥有许多的数据库连接。 尤其是由于我们添加了更多的“社交发现”功能(比 如我们的第一项约会功能Meet Me),拆分工作可能 会让PHP不堪重负。为了解决这个问题,我们开发了 一款Java应用程序,负责提供运行查询的Web服务; 该应用程序还继续提供一个非常方便的监控点,便于 轻松自如地处理数据库故障。 第五个阶段:2010年,架构完善和扩展、8000万个 用户和1000台服务器 这次我们把时间提前几年。解决了关键的数据库 扩展性问题后,我们发现通过添加硬件来支持扩展相 当容易。 在这一段期间,扩展性方面的考量因素转向了减 少故障和应对越来越多的易损坏部件所带来的威胁。 通过负载均衡器的运行状况检查和自动关闭毫无反 应的服务,实现了针对Web层的全方位保护,避免了 各种相关问题。我们在设计核心组件的架构时还考 虑到了弹性。 Java扮演了极其重要的角色,一方面归因于Java 越来越得到接受,拥有相应专长的人也越来越多;另 一方面是由于面临的挑战越来越多。为了对付垃圾 邮件及其他滥用现象,我们的算法充分利用了庞大的 共享内存空间,还充分利用了计算密集型方法。社交 游戏也得益于Java的高性能和并发控制,但面临的 代价是系统很复杂;现在不同的应用程序池比以前 多得多,有待我们加以管理。 本文有删节,完整内容见原文: Tagged Architecture - Scaling To 100 Million Users, 1000 Servers, And 5 Billion Page Views http://os.51cto.com/art/201108/283807.htm 007 《Linux 运维趋势》投稿信箱 : yangsai@51cto.com 杂志订阅 : http://os.51cto.com/art/201011/233915.htm 51CTO Linux 频道 :http://os.51cto.com/linux/ 八卦 News Linux 20周年庆,2011最佳开源软件 【2011年最佳开源软件】开源软件已经无所不在, 今年又有哪些开源软件对这个产业造成了深刻的影 响?请看2011年度Bossie奖的公布结果——最佳开 源应用程序、最佳桌面与移动应用、最佳开发软件、最 佳数据中心与云计算软件。 http://os.51cto.com/art/201109/290392.htm 【Ubuntu 11.10】经过了3个Alpha版之后,开发 代号为 Oneiric Ocelot的Ubuntu 11.10终于发布了 Beta 1版,主要新特性包括:全新的LightDM登录界 面、全新的Alt+Tab程序切换样式、Thunderbird为默 认邮件客户端等。 http://os.51cto.com/art/201109/288781.htm 【五个九】如今还有人真的把所谓“五个九”类 承诺当回事吗?从理论层面上来说,这意味着 99.999%的可用运行时间比例,也就是说业务经理 们每天会遭遇到的故障时段也就八分之一秒多一点。 http://os.51cto.com/art/201108/285496.htm 【二十年】Linux至今已走过二十年。LAMP架构 在Linux诞生之初诞生,不过从LAMP架构诞生之初 到现在已经有了很大的变化。 http://os.51cto.com/art/201108/285171.htm 【3650万】StudioNow证明了使用开源软件来构建 一个成功的科技企业是有可能的,事实上,StudioNow 是如此成功,于是AOL花费3650万美元买下了该公 司。 http://os.51cto.com/art/201109/289045.htm 【Linux Mint 11】Linux Mint 11 LXDE于8月16 日发布更新。这一版本在软件管理器、更新管理器等 方面都有更新。 http://os.51cto.com/art/201108/284674.htm 【Fedora 16】代号为“Verne”的Fedora 16 Alpha 经过一个星期的跳票,终于在8月24日晚正式发布 了。该版本给我们带来了许多新特性:GRUB 2 取代 GRUB 作为默认的 BootLoader、KDE 4.7 和 GNOME 3.1 开发版本更新、SELinux 增强等。 http://os.51cto.com/art/201108/285988.htm 【Debian 18载】2011年8月16日,世界上最流行 和最稳定的GNU/Linux发行版Debian走过了18周 年。在过去的18年里,Debian确立了自身最稳定操 作系统的定位,很多GNU/Linux发行版如Ubuntu和 Knoppix都是基于Debian。 http://os.51cto.com/art/201108/284455.htm 【26年】理查德·斯托曼于1985年10月创立了 自由软件基金会(FSF)。至今已26年,自由软件基 金会和刚刚年满20岁的Linux彻底地改变了整个计 算机世界,并引发了一场革命。直到现在,这场软件 革命仍没有结束,很可能仅仅是开始。 http://os.51cto.com/art/201109/289688.htm 【LinuxCon 2011】为庆祝Linux诞生20周年,, Linux Foundation于8月17日8月19日在温哥华 举办了LinuxCon 2011。包括 Linus Torvalds 先生 在内的多位业界大佬都参加了这一盛会,大佬们指点 江山、激扬文字,感怀过去、展望未来。 http://os.51cto.com/art/201108/281372.htm 【11个里程碑】Linux操作系统诞生到现在已经20 年了,在这20年里,Linux从学校里的玩物发展到今 天成为操作系统中一股坚实的力量。我们从这20年 中总结出Linux发展的11个重要的里程碑。 http://os.51cto.com/art/201108/287916.htm ——八卦,新闻与数字 2011.08 - 2011.09 008 《Linux 运维趋势》投稿信箱 : yangsai@51cto.com 杂志订阅 : http://os.51cto.com/art/201011/233915.htm 51CTO Linux 频道 :http://os.51cto.com/linux/ 专题 Special 服务器故障排除 当你的网络服务出现问题的时候,首先要做的事 情自然是分析问题出在哪里。在Linux系统下,有很 多工具可以帮助你发现故障的原因所在。一些基础 的排障工具包括: strace 如果一个应用编译正常但运行期间报错,报错信 息又不知所云,可以通过这个工具挖掘一些线索。 lsof 列出某个进程打开所有文件的信息——而在 Linux下,一切皆文件。 top 检查当前正在运行哪些进程,这些进程各自占用 的CPU和内存资源。 traceroute 检查两个节点之间网络接入情况的基本工具。 ping 检查远程服务器连接状况的基本工具。 hexdump 用来搜索二进制文件中的字符串,在没有源代码 的情况下,可以有效的定位问题所在。 来源:www.linux.com/archive/feed/60136 009 《Linux 运维趋势》投稿信箱 : yangsai@51cto.com 杂志订阅 : http://os.51cto.com/art/201011/233915.htm 51CTO Linux 频道 :http://os.51cto.com/linux/ 专题 Special strace命令使用实例 文/edeed 有时候一个程序出现了问题,无法找到原因,所以 我们需要调试。strace是一个必不可少的调试工具, 可以用来监视系统调用,不仅可以调试一个新开始的 程序,也可以调试一个已经在运行的程序。 首先让我们看一个真实的例子: 前一段时间,我在启动KDE的时候出了问题,KDE 的错误信息无法给我任何有帮助的线索。我决定采 用strace看一下在启动 dcopserver时到底程序做了 什么: strace -f -F -o ~/dcop-strace.txt dcopserver 这里 -f -F选项告诉strace同时跟踪fork 和 vfork出来的进程,-o选项把所有strace输出写到~/ dcop-strace.txt里 面,dcopserver是要启动和调试 的程序。再次出现错误之后,我检查了错误输出文件 dcop-strace.txt,文件里有很多系统调用的记录。在 程序运行出错前的有关记录如下: 其中第一行显示程序试图创建/tmp/.ICE- unix 目录,权限为0777,这个操作因为目录已经存在而失 败了。第二个系统调用(lstat64)检查了目录状态, 并显示这个目录的权限是 0755,这里出现了第一个 程序运行错误的线索: 程序试图创建属性为0777 的目录,但是已经存在了一个属性为 0755的目录。 第三个系统调用 (unlink)试图删除一个文件,但是这 个文件并不存在。这并不奇怪,因为这个操作只是试 图删掉可能存在的老文件。 但是,第四行确认了错误所在。它试图绑定到/ tmp /.ICE-unix/dcop27207-1066844596,但是出 现了拒绝访问错误。ICE_unix目录的用户和组都是 root,并且只有所有者具有写权限。一个非root用户 无法在这个目录下面建立文件,如果把目录属性改成 0777, 则前面的操作有可能可以执行,而这正是第一 步错误出现时进行过的操作。 用strace解决库依赖问题 strace的另一个用处是解决和动态库相关的问题。 让我们看一个例子: whoami程序会给出自己的用户名,这个程序在一 些 需要知道运行程序的真正用户的脚本程序里面非 常有用,whoami的一个示例输出如下: 27207 mkdir(“/tmp/.ICE-unix“,0777) = -1 EEXIST (File exists) (略) 假设因为某种原因在升级 glibc的过程中负责用 户名 和用户ID转换的库NSS丢失,我们可以通过把 nss库改名来模拟这个环境: # whoami root 这里可以看到,运行whoami时出现了错误,ldd 程序的输出不会提供有用的帮助: 只会看到whoami依赖Libc.so.6和ld-linux. so.2,它没有给出运行 whoami所必须的其它库。这 里时用strace跟踪 whoami时的输出: # mv /lib/libnss_files.so.2 /lib/libnss_files. so.2.backup # whoami whoami: cannot find username for UID 0 可以发现在不同目录下面查找libnss.so.2的尝 试,但是都失败了。如果没有strace这样的工具,很 难发现这个错误是由于缺少动态库造成的。现在只 需要找到libnss.so.2并把它放回到正确的位置就可 以了。 3 限制strace只跟踪特定的系统调用 如果已经知道要找什么,可以让strace只跟踪 一些类型的系统调用。例如,需要看看在configure 脚本里面执行的程序,需要监视的系统调用就 是 execve。让strace只记录execve的调用用这个命令: # ldd /usr/bin/whoami libc.so.6 = /lib/libc.so.6 (0x4001f000) /lib/ld-linux.so.2 = /lib/ld-linux.so.2 (0x40000000) 已经看到了,strace不仅可以被程序员使用,普通 系统管理员和用户也可以使用strace来调试系统错 误。 本文有删节,完整内容见原文: http://hi.baidu.com/edeed/blog/item/ c59d8d10f362e30a213f2eb8.html 010 《Linux 运维趋势》投稿信箱 : yangsai@51cto.com 杂志订阅 : http://os.51cto.com/art/201011/233915.htm 51CTO Linux 频道 :http://os.51cto.com/linux/ 专题 Special Unix调试的瑞士军刀:lsof Lsof是遵从Unix哲学的典范,它只做一件事情,并且做的相当完美——它可以列出某个进程打开的所 有文件信息。打开的文件可能是普通的文件,目录,NFS文件,块文件,字符文件,共享库,常规管道,明明 管道,符号链接,Socket流,网络Socket,UNIX域Socket,以及其它更多。 文/Peteris Krumins 译/张元一 如果说netcat是进行网络诊断的瑞士军刀,那么 lsof就是Unix调试的瑞士军刀。 Lsof遵从Unix哲学的典范,它只做一件事情,并 且做的相当完美——它可以列出某个进程打开的所 有文件信息。打开的文件可能是普通的文件,目录, NFS文件,块文件,字符文件,共享库,常规管道,明 明管道,符号链接,Socket流,网络Socket,UNIX域 Socket,以及其它更多。因为Unix系统中几乎所有东 西都是文件,你可以想象lsof该有多有用。 如何使用lsof? 这篇文章中我会尽力列举我能想到的所有lsof 的用法,让我们先从最简单的开始(或许你已经知道 了),然后逐渐增加复杂度: 列出所有打开的文件 # lsof 不带任何参数运行lsof会列出所有进程打开的所 有文件。 找出谁在使用某个文件 # lsof /path/to/file 只需要执行文件的路径,lsof就会列出所有使用 这个文件的进程,你也可以列出多个文件,lsof会列 出所有使用这些文件的进程。 你也可以一次制定多个文件: # lsof /path/to/file1 /path/to/file2 递归查找某个目录中所有打开的文件 # lsof +D /usr/lib 加上+D参数,lsof会对指定目录进行递归查找, 注意这个参数要比grep版本慢: # lsof | grep /usr/lib 之所以慢是因为+D首先查找所有的文件,然后 一次性输出。 列出某个用户打开的所有文件 # lsof -u pkrumins -u选项限定只列出所有被用户pkrumins打开的 文件,你可以通过逗号指定多个用户: # lsof -u rms,root 这条命令会列出所有rms和root用户打开的文件。 你也可以像下面这样使用多个-u做同样的事情: # lsof -u rms -u root 查找某个程序打开的所有文件 # lsof -c apache -c选项限定只列出以apache开头的进程打开的 文件: 所以你可以不用像下面这样写: # lsof | grep foo 而使用下面这个更简短的版本: # lsof -c foo 事实上,你可以只制定进程名称的开头: # lsof -c apa 这会列出所有以apa开头的进程打开的文件 你同样可以制定多个-c参数: # lsof -c apache -c python 这会列出所有由apache和python打开的文件 列出所有由某个用户或某个进程打开的文件 # lsof -u pkrumins -c apache 你也可以组合使用多个选项,这些选项默认进行 或关联,也就是说上面的命令会输入由pkrumins用户 或是apache进程打开的文件。 列出所有由一个用户与某个进程打开的文件 # lsof -a -u pkrumins -c bash -a参数可以将多个选项的组合条件由或变为与, 上面的命令会显示所有由pkrumins用户以及bash进 程打开的文件。 列出除root用户外的所有用户打开的文件 # lsof -u ^root 注意root前面的^符号,它执行取反操作,因此 lsof会列出所有root用户之外的用户打开的文件。 011 《Linux 运维趋势》投稿信箱 : yangsai@51cto.com 杂志订阅 : http://os.51cto.com/art/201011/233915.htm 51CTO Linux 频道 :http://os.51cto.com/linux/ 专题 Special 列出所有由某个PID对应的进程打开的文件 # lsof -p 1 -p选项让你可以使用进程id来过滤输出。 记住你也可以用都好来分离多个pid。 # lsof -p 450,980,333 列出所有进程打开的文件除了某个pid的 # lsof -p ^1 同前面的用户一样,你也可以对-p选项使用^来 进行取反。 列出所有网络连接 # lsof -i lsof的-i选项可以列出所有打开了网络套接字 (TCP和UDP)的进程。 列出所有TCP网络连接 # lsof -i tcp 也可以为-i选项加上参数,比如tcp,tcp选项会 强制lsof只列出打开TCP sockets的进程。 列出所有UDP网络连接 # lsof -i udp 同样udp让lsof只列出使用UDP socket的进程。 找到使用某个端口的进程 # lsof -i :25 :25和-i选项组合可以让lsof列出占用TCP或 UDP的25端口的进程。 你也可以使用/etc/services中制定的端口名称 来代替端口号,比如: # lsof -i :smtp 找到使用某个udp端口号的进程 # lsof -i udp:53 同样的,也可以找到使用某个tcp端口的进程: # lsof -i tcp:80 找到某个用户的所有网络连接 # lsof -a -u hacker -i 使用-a将-u和-i选项组合可以让lsof列出某 个用户的所有网络行为。 列出所有NFS(网络文件系统)文件 # lsof -N 这个参数很好记,-N就对应NFS。 列出所有UNIX域Socket文件 # lsof -U 这个选项也很好记,-U就对应UNIX。 列出所有对应某个组id的进程 # lsof -g 1234 进程组用来来逻辑上对进程进行分组,这个例子 查找所有PGID为1234的进程打开的文件。 列出所有与某个描述符关联的文件 # lsof -d 2 这个命令会列出所有以描述符2打开的文件。 你也可以为描述符指定一个范围: # lsof -d 0-2 这会列出所有描述符为0,1,2的文件。 -d选项还支持其它很多特殊值,下面的命令列出 所有内存映射文件: # lsof -d mem txt则列出所有加载在内存中并正在执行的进程: # lsof -d txt 输出使用某些资源的进程pid # lsof -t -i -t选项输出进程的PID,你可以将它和-i选项组 合输出使用某个端口的进程的PID,下面的命令将会 杀掉所有使用网络的进程: # kill -9 `lsof -t -i` 循环列出文件 # lsof -r 1 -r选项让lsof可以循环列出文件直到被中断,参 数1的意思是每秒钟重复打印一次,这个选项最好同 某个范围比较小的查询组合使用,比如用来监测网络 活动: # lsof -r 1 -u john -i -a 如何安装lsof? 许多Unix系统都内置了lsof,如果你的系统没有 安装,你可以从这里直接下载源代码。 BSD