2014年3月18日

摘要: 转自http://blog.tao.ma/?p=58这篇文章是淘宝内核组的刘峥同学在内部技术论坛上发表的一篇文章,但是由于刘峥同学目前没有blog,征得本人同意,贴在我的blog上,如果大家喜欢,请去新浪微博关注他。:)日前线上在升级到Ext4文件系统后出现应用写操作延迟开销增大的问题。造成这一问题的根源目前已经查明,是由于Ext4文件系统的一个新特性——Delay Allocation造成的。(后面简称delalloc)在详细分析这一问题之前,先来介绍一下Ext4文件系统的delalloc特性。这一特性简要概括起来就是将以前在buffer IO中每次写操作都会涉及的磁盘块分配过程推迟到数据回 阅读全文
posted @ 2014-03-18 15:47 山本二十八 阅读(752) 评论(0) 推荐(0) 编辑

2014年1月12日

摘要: 前一阵子公司一部门有人叫帮忙调查,说他们write系统调用基本上是个位数微秒就返回,或者说几十us,但偶尔出现几次write系统调用达到几百毫秒和情况。大家都知道,通过vfs进行write,都是写写到page cache中,然后内核线程再定期同步到磁盘。写到内存应该是很快的才对。刚开始,我做了许多设想,1)磁盘IO太重,内存中的脏数据达到一定比率后write必须同步写到磁盘;2)那些耗时长的write是使用direct io,绕过了page cache;3、刚刚好write一个page时,read也在读同一page,那个page被lock了,write要等它。后来每一种假设又都被自己推翻了.. 阅读全文
posted @ 2014-01-12 17:46 山本二十八 阅读(4816) 评论(0) 推荐(0) 编辑

2014年1月6日

摘要: 前几天微博上有同学问我磁盘util达到了100%时程序性能下降的问题,由于信息实在有限,我也没有办法帮太大的忙,这篇blog只是想给他列一下在磁盘util很高的时候如何通过blktrace+debugfs找到发生IO的文件,然后再结合自己的应用程序,分析出这些IO到底是谁产生的,最终目的当然是尽量减少不必要的IO干扰,提高程序的性能。blktrace是Jens Axobe写的一个跟踪IO请求的工具,Linux系统发起的IO请求都可以通过blktrace捕获并分析,关于这个工具的介绍请自行google之,这里推荐我们部门的褚霸同学的blog,里面有好几篇文章分别介绍了blktrace, blkp 阅读全文
posted @ 2014-01-06 13:44 山本二十八 阅读(1371) 评论(0) 推荐(0) 编辑

2014年1月3日

摘要: 1、netsh wlan set hostednetwork mode=allow ssid=livdran2012 key=100100100 。mode:是否启用虚拟WiFi网卡,改为disallow则为禁止。ssid:无线网名称,推荐最好用英文。(此处以livdran2012为例,可自由设置)key:无线网密码,限定八个以上字符。(此处以100100100为例,可自由设置)2、共享有线网络连接3、netsh wlan start hostednetwork 阅读全文
posted @ 2014-01-03 09:55 山本二十八 阅读(216) 评论(0) 推荐(0) 编辑

2013年12月12日

摘要: 转自http://blog.csdn.net/zklth/article/details/6248558文章http://blog.csdn.net/zklth/archive/2010/09/28/5912785.aspx介绍的是使用CentOS默认的SystemTap,这里介绍使用SystemTap源码独立安装SystemTap.源码下载地址SystemTap:ftp://sources.redhat.com/pub/systemtap/SystemTap:ftp://sources.redhat.com/pub/systemtap/releases/elfutils:https://fe 阅读全文
posted @ 2013-12-12 11:21 山本二十八 阅读(349) 评论(0) 推荐(0) 编辑

2013年12月11日

摘要: 转载地址:http://blog.ops88.com/2012/07/12/74一. /proc/sys/vm/dirty_background_ratio该参数是在尝试一个write back 操作之前所持有的脏内存比例。在Linux内核中,pdflush内核线程池负责VM的回写操作。并周期性同步文件系统给的元数据。若超出了这个后台回写百分比,则pdflush守护进程异步处理回写操作。在CentOS5.5下,这个参数是10二. /proc/sys/vm/dirty_expire_centisecs该参数是数据可以保持为dirty状态的最大厘秒数。这个时间段通过查询所有在内存中缓存了脏页面的文 阅读全文
posted @ 2013-12-11 15:24 山本二十八 阅读(623) 评论(0) 推荐(0) 编辑
摘要: 以下转自http://www.xaprb.com/blog/2009/08/23/how-to-find-per-process-io-statistics-on-linux/Newer Linux kernels have per-process I/O accounting and you can use the iotop tool to find out what’s performing I/O, but in many cases I’m trying to find the source of an I/O problem in an older kernel. I found 阅读全文
posted @ 2013-12-11 14:05 山本二十八 阅读(279) 评论(0) 推荐(0) 编辑
摘要: Limited Memory今天在虚拟机里面用Word处理文档的时候,突然硬盘灯一阵狂闪,然后虚拟机就一起消失了。这种事情屡见不鲜,很明显是Linux内核把占用最多内存的程序(这次是VirtualBox)终止掉了,而硬盘灯为什么会狂闪呢?这是因为在内存 用光之前,Linux的pdflush会把dirty pages写回磁盘上腾出内存给其他程序用。这段时间系统几乎处于不可用状态,Annoying!oom_killer默认配置下,当没有内存可以用而又要用到内存时,Linux内核的oom_killer(out of memory killer)会扫描一遍占用内存最多的程序(可能有多个,比如Virtu 阅读全文
posted @ 2013-12-11 07:40 山本二十八 阅读(594) 评论(0) 推荐(0) 编辑

2013年12月4日

摘要: iostat统计磁盘信息的时候,使用的是/proc/diskstats 。而/proc/diskstats是谁在写入呢?主要数据结构://genhd.hstruct disk_stats { unsigned long sectors[2]; /* READs and WRITEs */ unsigned long ios[2]; unsigned long merges[2]; unsigned long ticks[2]; // jiffies差 unsigned long io_ticks; // 从入队列到完成io的时间 unsigned lo... 阅读全文
posted @ 2013-12-04 16:54 山本二十八 阅读(2298) 评论(0) 推荐(0) 编辑

2013年11月26日

摘要: 摘要:和很多linux内核子系统一样,static tracepoint有很多层次,其中某个层次都展示给不同层次的开发者来满足他们的不同需求。关于linux tracepoint的详细信息,我们可以在linux内核文档Documentation/trace/tracepoints.txt和samples/tracepoints这两个地方找到。大致来说,对tracepoints本身的定义是第一个层次,一般只有内核开发者才会定义这些tracepoints;trace event是第二个层次,用于debug;第三个层次就是perf这些内核测试工具,他们调用底层的trace events来监控系统内核 阅读全文
posted @ 2013-11-26 14:21 山本二十八 阅读(3339) 评论(0) 推荐(0) 编辑
摘要: The Linux tracing APIs are a relatively new addition to the kernel and one of the most powerful new features its gained in a long time. Unfortunately the plethora of terms and names for the system can be confusing, so in this follow-up to my previous post on the proc connector and socket filter, I’l 阅读全文
posted @ 2013-11-26 13:40 山本二十八 阅读(692) 评论(0) 推荐(0) 编辑

2013年11月25日

摘要: ftrace 简介ftrace 的作用是帮助开发人员了解 Linux 内核的运行时行为,以便进行故障调试或性能分析。最早 ftrace 是一个 function tracer,仅能够记录内核的函数调用流程。如今 ftrace 已经成为一个 framework,采用 plugin 的方式支持开发人员添加更多种类的 trace 功能。Ftrace 由 RedHat 的 Steve Rostedt 负责维护。到 2.6.30 为止,已经支持的 tracer 包括:Function tracer和Function graph tracer: 跟踪函数调用。Schedule switch tracer: 阅读全文
posted @ 2013-11-25 10:36 山本二十八 阅读(407) 评论(0) 推荐(0) 编辑

2013年11月20日

摘要: top命令中有两项与内存相关的东西:buffer和cache。这两项与页高速缓存相关。磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。在linux内核的旧版本中,主要有两种不同的磁盘高速缓存:页高速缓存(page cache)和缓冲区高速缓存(buffer cache),前者用来存放访问磁盘文件内容时生成的磁盘数据页,后者把通过VFS(管理磁盘文件系统)访问的块的内容保留在内存中。从2.4.10的稳定版本开始,缓冲区高速缓存其实就不存在了。事实上,由于效率的原因,不再单独分配块缓冲区;相反,把它们存放在叫做“buffer page”的专门页中, 阅读全文
posted @ 2013-11-20 19:59 山本二十八 阅读(363) 评论(0) 推荐(0) 编辑

2013年11月11日

摘要: 关于lat(I/O completion latency)、clat(complete latency)、slat(summit latency):lat is the total latency. slat is the time it takes to submit theIO to the kernel, clat is the time from when slat is over and until thedevice has completed it (and the application is notified). Hence lat isslat + clat.1、rw_se 阅读全文
posted @ 2013-11-11 18:14 山本二十八 阅读(1048) 评论(0) 推荐(0) 编辑

2013年8月15日

摘要: lvm详细可以找百度百科这里做些补充:1) lvs 列出lv2) tune2fs调整和查看ext2/ext3文件系统的文件系统参数 阅读全文
posted @ 2013-08-15 10:00 山本二十八 阅读(142) 评论(0) 推荐(0) 编辑

2013年7月26日

摘要: 每个语句内嵌表达式都是一个可以声明局部跳转标签的域。一个局部标签只是一个标识符:你可以使用通常的goto语句跳到它--但是只能在它所属的域内这么做。一个局部标签的申明如下:__label__ label;或者:__label__ label1, label2, ...;局部标签的申明必须在语句内嵌表达式的开始出,紧跟({后面,在所有通常申明的左边。局部标签申明只是定义了标签的名字,但是并没有定义标签本身。 你必须用通常的标签使用方法来在语句内嵌表达式内部使用局部标签。由于语句内嵌表达式经常用于宏,所以局部标签特性非常有用。如果在宏里包含了循环,一个goto能很有效的跳出循环。然而通常的标签的作 阅读全文
posted @ 2013-07-26 11:22 山本二十八 阅读(382) 评论(0) 推荐(0) 编辑

2013年6月28日

摘要: Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析。你可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的malloc和free或者 C++中的new和 delete。使用Valgrind的工具包,你可以自动的检测许多内存管理和线程的bug,避免花费太多的时间在bug寻找上,使得你的程序更加稳固。Valgrind的主要功能Valgrind工具包包含多个工具,如Memcheck,Cachegrind,Helgrind, Callgrind,Massif。下面分别介绍个工具的作用:Memcheck 工具主要检 阅读全文
posted @ 2013-06-28 16:08 山本二十八 阅读(821) 评论(0) 推荐(0) 编辑

2013年5月24日

摘要: #ifdef AIXINT32 CProcessState::GetProcessState(const INT64 lPid, TProState* pProcessState){ INT32 nRet = ZX_SYS_NO_ERROR; char cState = CHAR_SNONE; pid_t pid = lPid; INT32 nState = 0; INT64 lPageSize = 0; struct procsinfo pi; if (pProcessState == NULL) { ZX_ERROR(LOG_N... 阅读全文
posted @ 2013-05-24 00:04 山本二十八 阅读(372) 评论(0) 推荐(0) 编辑

2013年1月10日

摘要: #ifdef OS_IBM sprintf(szCmd,"%s %d >>%s", "procstack", getpid(),abnTraceFileName); system(szCmd);#else sprintf(szCmd,"%s %d >>%s", "pstack", getpid(),abnTraceFileName); system(szCmd); #endif 阅读全文
posted @ 2013-01-10 10:57 山本二十八 阅读(388) 评论(0) 推荐(0) 编辑

2013年1月8日

摘要: 一. 前言shell编程在unix/linux世界中使用得非常广泛,熟练掌握shell编程也是成为一名优秀的unix/linux开发者和系统管理员的必经之路。脚本调试的主要工作就是发现引发脚本错误的原因以及在脚本源代码中定位发生错误的行,常用的手段包括分析输出的错误信息,通过在脚本中加入调试语句,输出调试信息来辅助诊断错误,利用调试工具等。但与其它高级语言相比,shell解释器缺乏相应的调试机制和调试工具的支持,其输出的错误信息又往往很不明确,初学者在调试脚本时,除了知道用echo语句输出一些信息外,别无它法,而仅仅依赖于大量的加入echo语句来诊断错误,确实令人不胜其繁,故常见初学者抱怨sh 阅读全文
posted @ 2013-01-08 16:04 山本二十八 阅读(268) 评论(0) 推荐(0) 编辑

2012年11月8日

摘要: 就当作个笔记 ,以后慢慢补充。ps avx | head -1; ps avx | grep 307496 PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND307496 - A 2478:25 309661 47360 21900 32768 3632 2332 0.1 1.0 PatrolAgentSIZE:进程数据段大小(可能在内存中,也可能在换页空间中,不包括代码段)RSS :进程实际占用实际内存大小(包括代码段)TRS:代码段占用实际 内存大小 进程占用的换页空间可以大致这样算:SIZE-(RSS-TRS)按我 阅读全文
posted @ 2012-11-08 11:15 山本二十八 阅读(262) 评论(0) 推荐(0) 编辑

2012年10月31日

摘要: 1、const char* const authorname = "Scott"2、无法用define创建一个class专属常量,因为define并不重视作用域。一量定义 ,它就在其后的编译过程 中都有效3、对于单存常量,最好以const对象或enum替换 define (宏使用的名称未进入记号表) 对于形似函数的宏,最好改用inline函数替换define 参数如果不需要更改,定义为const4、const成员函数。const成员函数才可被const对象调用5、bitwise constness (又称physical constness):不更改对象之任何成员变量(st 阅读全文
posted @ 2012-10-31 10:45 山本二十八 阅读(190) 评论(0) 推荐(0) 编辑

2012年10月28日

摘要: 关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的《C++ 的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_cast, dynamic_cast。标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。下面对它们一一进行介绍。static_cast用法:static_cast < type-id > ( expression_r_r )该运算符把expression_r_r转换为type-id类型,但没有运行时类型检查来保 阅读全文
posted @ 2012-10-28 11:07 山本二十八 阅读(235) 评论(0) 推荐(0) 编辑

2012年10月22日

摘要: 1: 可以在析构函数中抛异常吗? 不可以! 虽然语法上并没错,但会对整体系统带来重大隐患!!2: 那么如何保证析构不抛异常呢? 2.1)析构里如同构造函数一样,做一些简单的操作。 2.2)如果异常不可避免,那么直接在析构里捕获异常,不要让异常逃离析构函数!3: 析构里抛异常有什么危害呢? 阻止异常传递到析构函数外有两个原因,第一能够在异常转递的堆栈辗转开解(stack-unwinding)的过程中,防止terminate被调用。第二它能帮助确保析构函数总能完成我们希望它做的所有事情。 //////////////////////////////////////////////////////. 阅读全文
posted @ 2012-10-22 15:33 山本二十八 阅读(1115) 评论(0) 推荐(0) 编辑

2012年10月10日

摘要: 如果每次new出来 ,都要判断是否成功(地址是否为空),那么也挺麻烦的。c++提供set_new_handler,当new失败时,会调用set_new_handler设置的回调函数。functionstd::set_new_handler<new>new_handler set_new_handler (new_handler new_p) throw();Set new handler functionSetsnew_pas thenew handlerfunction.Thenew handlerfunction is the function that is called b 阅读全文
posted @ 2012-10-10 10:16 山本二十八 阅读(1824) 评论(0) 推荐(0) 编辑

2012年10月9日

摘要: Using C++ templatesIn C++, you can use a template to declare a set of related:Classes (including structures)FunctionsStatic data members of template classesWithin an application, you can instantiate the same template multiple times with the same arguments or with different arguments. If you use the 阅读全文
posted @ 2012-10-09 15:21 山本二十八 阅读(239) 评论(0) 推荐(0) 编辑
摘要: placement new是重载operator new的一个标准、全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本)。它的原型如下:void *operator new( size_t, void *p ) throw() { return p; }首先我们区分下几个容易混淆的关键词:new、operator new、placement newnew和delete操作符我们应该都用过,它们是对堆中的内存进行申请和释放,而这两个都是不能被重载的。要实现不同的内存分配行为,需要重载operator new,而不是 阅读全文
posted @ 2012-10-09 09:45 山本二十八 阅读(156) 评论(0) 推荐(0) 编辑

2012年9月11日

摘要: 性能分析工具gprof介绍Ver:1.0目录1. GPROF介绍 42. 使用步骤 43. 使用举例 43.1 测试环境 43.2 测试代码 43.3 数据分析 53.3.1 flat profile模式 63.3.2 call graph模式 74. 链接库中的函数 75. 使用局限 86. 分析示例 12%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1. gprof介绍gprof是GNU profile工具,可以运行于linux、AIX、Sun等操作系统进行C、C++、Pascal、Fortran程序的性能分析,用于程序的性能优化以及程序瓶颈问题的查找和解 阅读全文
posted @ 2012-09-11 16:13 山本二十八 阅读(1144) 评论(0) 推荐(0) 编辑

2012年9月10日

摘要: 在编译一个软件包时看见下面rules文件中出现“binary-predeb/gir1.0-unique-1.0::”,对这里的双冒号很是不解,经查阅资料,才明白一点儿。#!/usr/bin/make-finclude/usr/share/cdbs/1/class/autotools.mkinclude/usr/share/cdbs/1/rules/debhelper.mkinclude/usr/share/cdbs/1/rules/simple-patchsys.mkinclude/usr/share/cdbs/1/rules/utils.mkinclude/usr/share/cdbs/1/ 阅读全文
posted @ 2012-09-10 10:43 山本二十八 阅读(1284) 评论(0) 推荐(1) 编辑
摘要: make_heap, push_heap, pop_heap, sort_heap“堆”定义 n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质): (1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n),当然,这是小根堆,大根堆则换成>=号。//k(i)相当于二叉树的非叶结点,K(2i)则是左孩子,k(2i+1)是右孩子 若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树: 树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。看如下代码:#in 阅读全文
posted @ 2012-09-10 10:16 山本二十八 阅读(154) 评论(0) 推荐(0) 编辑

导航