• 随着要维护的服务器增多,遇到的各种稀奇古怪的问题也会增多,要想彻底解决这些“小”问题往往需要更深的Linux方面的知识。越专业、分工越细的工程师,在这方面的要求也就越高。这次,对MySQL Swap的问题的探索过程,就一不小心掉进了Linux Memory Managemant(Linux MM)的研究中去了,爬了很久才出来,这里做一个系列笔记。

    笔记中很多内容都是参考《Understanding the Linux Kernel, 3rd Edition》、Linux Source Code等地方,自己再做了一些总结,觉得有意义的总结这里记录一下,供参考。

    1. 写在前面

    Linux MM是一个比较猥琐的体系,虽然理论不太多,但是细节非常多。要从底层物理内存管理到上层虚拟内存管理整个关节打通,一方面需要较多底层架构知识、还需要很深的Linux知识。既然是学习笔记,先说一下我的学习资料:

    1. Linux Memory Management David A Rusling 这本书很老了,当时的Kernel还是2.0.33版本的;这本书的优点在于抽象得很到位,把Linux_MM的基本模块、思想都通俗易懂的介绍了一遍。这也是kernel-docs.txt中推荐的读物之一;

    2. 《Understanding the Linux Kernel, 3rd Edition》中的第二、八、十七章 这是基于2.6内核,非常有参考价值,介绍得非常细致,可以结合内核的源代码一起来看。

    3. Linux Source Code 只看了几个自己关心的函数,没那么难:)

    我不是计算机科班出身,体系结构的基础比较差,所以刚开始入门的时间相对较长,前后大概历时一个月,实际伏案时间约50小时,而这也只是一个开始

    2. 基本框架

    上面是一幅简图,后面会分别介绍,Kernel如何使用内存、Kernel如何管理分配内存、用户空间的内存管理。对于其中的一些细节则会单独介绍,例如大页内存,内存回收算等等。

    2. Linux启动与内存管理

    开机的第一个过程是BIOS自检,BIOS使用0x00000000到0x10000(1MB)内存,这1MB内存包括了自检程序、自检结果、还留一部分给显示设备使用;自检完成后,开始载入Linux内核,Linux从1MB开始使用物理内存,一般5MB就足够了,在内核的符号信息中可以看到,Linux内核从_text开始,_edata处结束

    $more /boot/System.map-2.6.9-55.ELsmp|grep “\ _text$\|_etext$\| _edata$\| _end$”
    ffffffff80100000 A _text
    ffffffff80310399 A _etext
    ffffffff80456aa8 A _edata

    简图:

    这里不涉及x86架构下的分页、分段细节,后面会单独介绍之。

    这一篇很简单,是一个开始:)

    【update 2011-03-29】

    64位系统中,Linux(2.6.18)从2MB开始使用物理内存。(32位系统,仍然是从1MB开始)

    file: ./arch/x86_64/defconfig
    CONFIG_PHYSICAL_START=0x200000
    //This gives the physical address where the kernel is loaded.

    参考文献:

    [1]. http://cateee.net/lkddb/web-lkddb/PHYSICAL_START.html

    广告时间:工作机会–MySQL Hacker

  • 2011年2月9日

    今天是春节后的第一天上班,在家过完了农历年才最终感觉2010的结束。

    2010年4月份曾给自己的写了一份要求,刚才简单盘点了一下

    希望中的2011:

    1. 每天下班后,自由工作两个小时,做自己喜欢做的事情。偶尔可以工作到凌晨。

    2. 坚持写博客,看很多电影、书,写影评、书评

    3. 通关一个游戏,偶尔打Dota

    4. 关注网络,关注CCTV;每天叠好被子,保持工牌吊带干净

    5. 有想法,先实现,再迭代,不要想太多

    6. 爱己,爱人;珍惜家人,朋友

    7. 不追求多么灿烂的人生,想清楚自己想要什么,希望找到自己活着的意义(有趣的参考 updated @2011-02-11)

    路

  • 也忘了第一次用Top观察Linux运行状态是什么时候了,不过最近吧Top的文档收获不少。

    1. 有用的命令top-z-x
    z    :打开/关闭彩色显示
    x    :高亮显示排序列
    

    在使用top命令后,“先按z键,再按x键”,这时屏幕会彩色显示输出,白色显示的列是当前排序的列;偶尔还会有一些白色显示行,这些行是当前正在运行进程。使用该参数可以帮助我们更清楚的看到排序列。例如,我想按照cpu使用排序来查看进程:

    top-z-x

    使用了top-z-x命令后是不是看得清晰了一些:)

    2. 有用的命令top-1
    1    :SMP的系统,会单独显示各个CPU的运行状态
    

    top-1

    3. 选择排序列top-z-x-<
    <    :改变排序列
    >    :改变排序列
    

    top-z-x-< 试试就知道是什么意思了:) 。例如,默认是按照cpu使用率排序的,现在我想看看安装使用的虚拟内存排序看看,使用命令top-z-x-<-<-<-<-< :

    top-z-x-lt

    4. 其他技巧
    W    :把当前配置文件到home目录下.toprc配置文件中
    F or O :支持更强的选择排序列的方式
    
    -b   :参数可以帮你在脚本中使用top命令
    -n   :配合-b使用,表示重新刷新一定次数后退出
    -d   :刷新延时时间。例如-d 5 表示top每隔5秒刷新一次。(默认是3秒)
    

    就这些吧,更多请查看top-h或者RTFM

    最后,各位看官,工作之余别忘了多多运动,没什么比健康更重要了:)

  • idata-Forum分享

    刚刚完成在idata-forum的主题分享,介绍了一下最近一年在MySQL方面的尝试,包括性能调优,代码优化方面的内容。

    不再紧张了。

  • DBA是一个高危职业,因为接触的是最底层数据,一个很小很小的失误,足以放大到让整个系统崩溃。从来公司DBA系统组的第一天起,看过很多同事犯错,有犯大错,有犯小错的,有把公司网站搞挂的,也有只影响内部系统的。每次这种时候,我总对自己说,有一天我也是会犯错的,这会一天是哪一天呢?

    同事们都很小心,每次操作如履薄冰,每次变更反复检查,虽偶有懈怠,彼此也通过各种方式会相互提醒。这样我们能够避免多数错误,能够借此追求系统的稳定,追求我们的目标。

    人会犯错,偶尔的懈怠也终究有一天会演变成一次致命的故障。我总对自己说,有一天我也是会犯错的,这会一天是哪一天呢?今天有答案了。

    我想对自己说一句:对不起。

  • 如果用的引擎是InnoDB,每次敲下mysqladmin -uroot -p shutdown关闭数据库的时候,总是很难预测这个命令会执行多久,实际经验表明,短则五秒,长则三十分钟一小时都有可能。也分享一下我的经验吧。

    1. 为什么InnoDB关闭会慢?

    事实上,并不是每次关闭InnoDB都很慢的。Why?InnoDB较之MyISAM,一个重要特性是InnoDB会在内存中开辟一个Buffer Pool来存储最近访问的数据块/索引块,使得下次再次访问这个块时速度能够很快。当InnoDB对需要修改数据块的时候,会先记录修改日志,然后直接对Buffer_Pool中的数据块的操作。记录日志是顺序写,对数据块的操作是内存操作,这让InnoDB在很多场景下有这很好的速度优势。 (more…)