Linux服务器性能调整教学提纲_第1页
Linux服务器性能调整教学提纲_第2页
Linux服务器性能调整教学提纲_第3页
Linux服务器性能调整教学提纲_第4页
Linux服务器性能调整教学提纲_第5页
已阅读5页,还剩145页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Good is good, but better carries it.精益求精,善益求善。Linux服务器性能调整Linux服务器性能调整(美)SandraK.JohnsonGerritHuizengaBadariPulavarty著韩智文译北京AuthorizedtranslationfromtheEnglishlanguageedition,entitledPerformanceTuningforLinuxServers,9780137136285bySandraK.Johnson,GerritHuizenga,BadariPulavarty,publishedbyPearsonEduc

2、ation,Inc,publishingasIBMPress,Copyright2005.Allrightsreserved.Nopartofthisbookmaybereproducedortransmittedinanyformorbyanymeans,electronicormechanical,includingphotocopying,recordingorbyanyinformationstorageretrievalsystem,withoutpermissionfromPearsonEducation,Inc.CHINESESIMPLIFIEDlanguageeditionpu

3、blishedbyPEARSONEDUCATIONASIALTD.,andTSINGHUAUNIVERSITYPRESSCopyright2009.北京市版权局著作权合同登记号图字:01-本书封面贴有PearsonEducation(培生教育出版集团)防伪标签,无标签者不得销售。版权所有,侵权必究。侵权举报电话:010-6278298913701121933图书在版编目(CIP)数据Linux服务器性能调整/(美)约翰逊(Johnson,S.K.),(美)威曾格(HuizengaG.),(美)普拉瓦提(Pulavarty,B.)著;韩智文译.北京:清华大学出版社,2009.8书名原文:Perf

4、ormanceTuningforLinuxServersISBN978-7-302-20739-9I.L.约威普韩.Linux操作系统.TP316.89中国版本图书馆CIP数据核字(2009)第111077号责任编辑:王军于平装帧设计:孔祥丰责任校对:成凤进责任印制:出版发行:清华大学出版社地址:北京清华大学学研大厦A座邮编:100084社总机购稿与读者服务c-service质量反馈zhiliang印刷者:装订者:经销:全国新华书店开本:185260印张:27.5字数:669千字版次

5、:2009年8月第1版印次:2009年8月第1次印刷印数:14000定价:58.00元本书如存在文字不清、漏印、缺页、倒页、脱页等印装质量问题,请与清华大学出版社出版部联系调换。联系电话3103产品编号:主要内容:本书是优化Linux系统和应用程序性能的必备指南。从华尔街到好莱坞,在Linux操作系统上运行着世界上大量最重要的商业系统。Linux的性能现在会对整个企业产生影响。在本书中,IBM公司经验最丰富的Linux性能专家团队将介绍如何发现瓶颈、测量性能并确定有效的优化措施。本书不仅涉及到内核调整,还展示对运行于Linux之上的真实应用程序和数据库的端到端性能加

6、以优化的技术。在全书中,作者给出了建立在当今最流行的企业级Linux平台基于Intel的RedHatEnterpriseLinux以及NovellSUSELinuxEnterpriseServer之上的真实示例。这些示例简单明晰,易改编用于当代的各种Linux环境。通过本书,将可以学习以下内容:安装和配置Linux以便达到最高性能为用户的Linux环境评估并选择适当的硬件体系结构理解Linux2.4至2.6版本的内核:组件、性能问题以及优化可能性掌握Linux性能调整的核心原则和策略利用免费的开源工具进行测量、监控、系统跟踪以及基准测试对性能数据加以解读,以便分析Linux服务器的真实行为优化

7、Linux系统的调度器、内存、I/O、文件系统和网络对运行商业工作负荷的Web、文件、数据库,及应用服务器进行调优预测调整参数或配置信息的变化所产生的影响调整Linux代码:对设计、定时、套接字、线程、同步等问题加以优化针对最高性能设计系统架构:SMP扩展、集群方法及拓扑结构将内核与应用的调整集成到端到端的系统优化方案之中无论对于管理员、开发人员、集成人员还是咨询顾问来说,本书都有助于最大化所运行的每个Linux系统和应用程序的性能及价值。作者简介SandraK.Johnson博士是一名拥有16年经验的高级技术人员。她的研究领域涉及cache一致性协议、存储子系统、并行I/O子系统、Java服

8、务器以及Linux领域的工作负荷描述与性能分析。她是IBMLinux技术中心的Linux性能架构师,目前是IBM系统与技术事业部的全球中小型企业部门的首席技术官。GerritHuizenga是IBM俄勒冈州比弗顿Linux技术中心的Linux基础技术(LinuxBaseTechnologies)的软件工程师和架构师。Gerrit已经致力于架构、设计和实现操作系统的能力达20余年,重点关注性能、可扩展性、标准和安全。在为IBMLinux技术中心工作之前,Gerrit是SequentComputerSystems公司的操作系统首席专家。BadariPulavarty是IBM俄勒冈州比弗顿Linux

9、技术中心的高级工程师;具有15年开发UNIX操作系统的经验;主要研究领域是Linux在VM、I/O、文件系统和存储子系统方面的性能问题。前言廉价的硬件、运行的高稳定性以及不懈的技术开发造就了Linux(开源)操作系统的不断发展。Linux最常见的用途是充当Web服务器。当前,它可以提供众多企业级服务,如电子邮件、防火墙、代理、网关、数据库、应用程序、文件服务器、打印等。在更高端的企业服务器领域,Linux也即将成为一种具有竞争力的操作系统。主要的华尔街公司、电影制作公司以及其他众多企业都在转向使用Linux以满足其对企业服务器的需求。随着服务器的部署日益增多,服务器操作系统的性能已成为系统整体

10、效率的决定因素,并将会影响到所有用户。虽然使用更新更快的服务器来替换整个服务器也是一种解决方案,但更合适的办法常常是只替换或添加必需的组件而使其他组件保持不变。系统性能低下的原因多源于个别硬件子系统中存在着瓶颈、操作系统配置不当或者应用程序缺少性能优化等问题。提高性能的关键是要理解系统中有哪些可用的软硬件配置选项,理解性能工具及其用法,对利用这些工具获取的结果进行分析并对系统进行适当调整,从而对服务器性能产生正面影响。本书提供了理解和改善Linux服务器性能所需的基本知识和技能。由Linux专业人员编写,并基于大家共同的实际经验,描述了Linux性能监控、评估、测量和分析的方法以及Linux服

11、务器的调优方法。还讨论了对基于Intel硬件平台以及Linux操作系统运行的商业服务器应用程序的性能加以改进和优化的方法。本书中采用的是简单易懂的渐进式性能调优方法。首先介绍Linux内核的有关知识,然后讨论Linux服务器、性能工具和调优技术,之后介绍Linux服务器的性能特征,并给出稍加改动就可适用于各种情形的调优示例。本书中的论述主要基于两种Linux版本:RedHatEnterpriseLinux和NovelSUSELinuxEnterpriseServer。另外,假定服务器基础硬件为基于Intel的平台,这是因为这种硬件平台在Linux社区中得到普遍使用。但Linux服务器的性能调优

12、机制也很容易移植到其他平台上。服务器的具体应用包括Web服务器、文件和打印服务器、数据库服务器、网络管理服务器以及Web应用服务器等。本书中涉及到的相关讨论和示例都基于Linux2.4、2.5和2.6内核。本书由5部分构成:“Linux概述”、“性能分析工具”、“系统调优”、“Linux服务器应用的性能特征”与“调优案例分析”。第部分“Linux概述”简述了与Linux安装以及Linux内核和服务器体系结构相关的问题。第部分“性能分析工具”详细介绍了与3个领域相关的性能工具:系统性能和监控、系统跟踪以及基准测试。第部分“系统调优”讨论了性能调优的原则与策略,还讨论了调度器、内存、I/O、文件系

13、统以及网络和代码的调优机制。第部分“Linux服务器应用的性能特征”描述了服务器应用程序的性能特征,包括影响其性能的潜在因素。还给出了关于Web、文件、数据库和应用程序服务器的讨论。第部分“调优案例分析”给出了大量示例来阐释如何将前述各部分中的所有工作加以集成,从而实施一个包含各种场景的调优方案。所提供的案例分析包括调度器、I/O、文件系统以及网络和商业工作负荷的调优。本书的附录中讨论了许多可调优的内核参数,并阐述了使用sysctl、/proc和sysfs接口来调优Linux内核的方法。目录第部分Linux概述第1章Linux系统安装的性能问题31.1引言31.2安装前的规划31.2.1选择分

14、区位置41.2.2使用多个硬盘驱动器41.2.3选择文件系统41.2.4转换文件系统51.2.5配置RAID61.3Linux2.6内核的可配置属性81.3.1I/O提升器81.3.2超大TLB页面支持81.4Linux日志工具91.4.1/var/log/messages文件91.4.2/var/log/XFree86.0.log文件91.4.3日志轮转101.4.4日志工具101.4.5日志定制101.5BSD与系统V的初始化机制111.5.1初始化表(/etc/inittab)111.5.2BSD的初始化表(Slackware)121.5.3系统V的初始化表(RedHat)131.6小结

15、141.7参考文献14第2章Linux内核机制152.1引言152.2Linux的发展历程152.3Linux内核体系结构152.3.1内核的职能162.3.2内核组织结构与模块162.3.3内核服务162.3.4/proc文件系统的外部性能视图162.3.5内存管理172.4进程管理182.4.1进程、任务与内核线程192.4.2调度与上下文切换192.5进程间通信202.5.1信号202.5.2管道202.5.3系统V的IPC机制212.6Linux对称多处理(SMP)模型222.6.1多处理系统类型222.6.2同步与数据串行化222.6.3锁、锁粒度与锁开销222.6.4cache一致

16、性232.6.5处理器亲和度232.7文件系统232.7.1虚拟文件系统(VFS)232.7.2ext2fs232.7.3LVM与RAID242.7.4磁盘卷组242.7.5设备相关文件252.7.6devfs252.8Linux2.6内核的新特性262.9小结262.10参考文献27第3章服务器体系结构293.1引言293.2Linux服务器293.3多处理器与多处理机制303.3.1服务器拓扑结构303.3.2处理器的混用机制313.4内存323.5I/O333.6Linux企业级服务器343.7Linux集群353.7.1高性能集群353.7.2高可用集群363.8服务器系统示例363.

17、8.1IBMzSeries大型机363.8.2刀片服务器393.8.3NUMA393.9小结44第部分性能分析工具第4章系统性能监控474.1引言474.2Linux与性能分析的背景知识474.3CPU利用率494.3.1vmstat514.3.2top与gtop工具534.3.3sar544.4内存利用率564.4.1/proc/meminfo与/proc/slabinfo564.4.2ps574.4.3vmstat594.5I/O利用率594.5.1iostat614.5.2sar624.6网络利用率634.6.1网络统计信息644.6.2接口信息664.6.3TCP/IP协议统计数据66

18、4.6.4nfsstat674.7小结674.8参考文献67第5章系统跟踪工具695.1引言695.2系统跟踪机制的需求695.3top705.4strace725.5OProfile745.5.1opcontrol755.5.2数据概况描述工具765.6PerformanceInspector825.6.1AboveIdle835.6.2Per-ThreadTime845.6.3TraceProfiling865.6.4指令跟踪895.6.5JavaProfiler915.6.6JavaLockMonitor1035.6.7PerformanceInspector的执行工具1065.7小结1

19、075.8参考文献107第6章工作负荷的性能基准测试1096.1引言1096.2改进工作负荷的基准测试方法1106.3基准测试的类型1116.4微基准测试1116.4.1操作系统基准测试1116.4.2磁盘基准测试1246.4.3网络基准测试1326.4.4应用基准测试1336.5Web服务器基准测试1376.5.1SPECweb、SPECwebSSL与TPC-W1376.5.2SPECjAppServer与ECPerf1386.5.3其他应用基准测试1396.6小结139第部分系统调优第7章系统性能原理和策略:基准测试方法的案例分析1437.1引言1437.2性能评价方法1437.2.1跟踪

20、机制1437.2.2工作负荷特征描述1447.2.3数值分析1447.2.4模拟方法1447.3基准测试案例分析1447.4分析方法1457.4.1软硬件配置1457.4.2运行规则1467.4.3设置目标1467.4.4测量、分析与调优1467.4.5退出策略1477.5基准测试程序1487.5.1基准测试程序介绍1487.5.2性能结果1497.6小结1517.7致谢1527.8参考文献152第8章调度器调优1538.1引言1538.2单处理器系统1538.3对称多处理1548.4非一致内存访问1548.5对称多线程1558.6Linux2.6内核调度器1558.7负载平衡1568.8调度

21、器的可调参数1578.8.1*CHILD_PENALTY1578.8.2*CREDIT_LIMIT1578.8.3*EXIT_WEIGHT1578.8.4*INTERACTIVE_DELTA1578.8.5*MAX_SLEEP_AVG1588.8.6*MAX_TIMESLICE1588.8.7*MIN_TIMESLICE1588.8.8*PARENT_PENALTY1588.8.9*PRIO_BONUS_RATIO1588.8.10*STARVATION_LIMIT1588.9小结1598.10参考文献159第9章Linux虚存的性能问题1619.1引言1619.2内存与地址空间1629.2.

22、1地址空间1629.2.2用户地址空间1629.2.3VM区域1639.2.4内核地址空间1649.3高端内存支持1659.4分页与交换机制1659.4.1替换策略1669.4.2页面替换与内存平衡1679.5Linux页表1679.6Linux2.6内核中的新特性1699.6.1rmap与objrmap1699.6.2大型页面的支持1699.6.3页面分配与替换1709.6.4Slab分配器1719.6.5VM的可调参数1719.6.6CPU调度器1739.7小结1759.8参考文献175第10章I/O子系统的性能问题17710.1引言17710.2I/O调度与块I/O(BIO)层17710

23、.2.1Linux2.6内核的I/O调度器17810.2.2Linux2.4内核的I/O调度器17910.2.3Linux2.6内核的最终期限I/O调度器17910.2.4调度器的可调参数18010.2.5Linux2.6内核的AnticipatoryI/O调度器18110.2.6Linux2.6内核的CFQ调度器18310.2.7Linux2.6内核的noopI/O调度器18310.2.8I/O调度器的性能含义18310.3批量读写请求18410.4读预测启发算法18410.5影响性能的I/O部件18510.6I/O设备寻址18610.7小结18610.8参考文献186第11章文件系统调优1

24、8911.1引言18911.2文件系统基本知识18911.2.1文件系统的实现考虑18911.2.2创建优化的文件系统19011.2.3文件系统基本术语19011.3日志型文件系统19211.3.1文件系统的故障处理机制19311.3.2事务机制19311.3.3选项19411.4影响文件系统性能的磁盘因素19511.4.1物理磁盘存储器的考虑事项19511.4.2磁盘的性能特征19611.4.3传输速率19611.4.4hdparm19711.5文件系统的碎片整理19911.6文件同步19911.6.1确保数据或文件完整性20011.6.2使用函数调用20011.6.3使用文件描述符2001

25、1.6.4sync/fsync的性能含义20111.7bdflush参数20111.8异步输入与输出20211.8.1使用异步I/O20211.8.2异步I/O函数20211.9原始磁盘I/O20311.9.1在Linux上设置原始I/O20311.9.2示例20311.10Ext2与Ext3文件系统20411.10.1Ext2的组织结构20411.10.2Ext2文件系统中的块分配方式20611.10.3创建Ext2文件系统20611.10.4Ext2文件系统的Ext3扩展机制20711.10.5Ext3的内核配置支持20711.10.6Ext3文件系统调优方法20811.10.7创建Ext

26、3分区20811.10.8Ext2与Ext3的转换20911.10.9建立外部日志20911.10.10Ext2/Ext3工具20911.11ReiserFS21011.11.1ReiserFS的内核配置支持21111.11.2ReiserFS文件系统调优方法21111.11.3创建ReiserFS文件系统21111.11.4建立外部日志21211.11.5挂接ReiserFS文件系统21211.11.6挂接选项21311.11.7调优ReiserFS21311.11.8ReiserFS文件系统实用工具21411.12日志式文件系统21411.12.1JFS的内核配置支持21511.12.2J

27、FS文件系统的调优方法21511.12.3创建JFS文件系统21611.12.4建立外部日志21611.12.5挂接文件系统21611.12.6挂接选项21611.12.7调优JFS21711.12.8JFS文件系统实用工具21711.13下一代文件系统21711.13.1XFS的内核配置支持21811.13.2XFS文件系统的调优方法21811.13.3创建XFS文件系统21911.13.4容量饱和时的文件系统行为21911.13.5建立外部日志21911.13.6挂接文件系统22011.13.7挂接选项22011.13.8调优XFS22011.13.9XFS文件系统实用工具22111.14

28、小结22211.15参考文献223第12章网络调优22512.1引言22512.2网络协议栈22512.3内核参数调优机制22612.4内核自动调优机制22612.5核心内核参数22712.6TCP/IPv4协议内核参数22812.6.1TCP缓冲区与内存管理22812.6.2TCP选项23012.6.3TCP连接管理23112.6.4TCP连接保持管理23212.6.5IP端口范围23312.7小结23312.8参考文献233第13章进程间通信23513.1引言23513.2进程间通信的定义23513.3LinuxSysV的IPC资源与ipcs命令23613.3.1ipcs命令23613.3

29、.2IPC标识符及其限制23713.4信号量参数23813.4.1semmni23813.4.2semmns23913.4.3semmsl23913.4.4semopm23913.4.5semvmx23913.4.6未用的信号量参数23913.5消息队列参数24013.5.1msgmni24013.5.2msgmax24013.5.3msgmnb24113.5.4未用的消息队列参数24113.6共享内存段参数24113.6.1shmmni24213.6.2shmmax24213.6.3shmmin24213.6.4shmall24213.7可配置IPC参数的动态修改机制24213.7.1使用/

30、proc24213.7.2使用sysctl24313.8IPC参数的静态配置24313.9管道机制24313.10小结244第14章代码调优24514.1引言24514.2一般原则24514.3应用的概要描述工具24614.4编译器选项调优24614.4.1性能调优的基本步骤24714.4.2编译器优化的问题24714.5代码调优24714.6算法设计调优24814.6.1问题与解决方案的可能性24814.6.2问题描述24814.6.3程序24914.6.4设计代码25114.6.5服务器25114.6.6计时25214.6.7Socket25314.6.8线程25614.6.9同步2591

31、4.6.10文件I/O26214.6.11客户端26414.6.12代码讨论26614.6.13编译选项26614.6.14链接库26714.7小结268第部分Linux服务器应用的性能特征第15章Web服务器的性能调优27115.1引言27115.2HTTP请求与响应27215.3Web服务器的网络行为27315.4Web服务器事务27515.5Web服务器模型27515.6Web服务器的调优方法27615.6.1Web服务器的通用调优机制27715.6.2Apache服务器的调优机制27715.6.3Flash与事件驱动的其他服务器的调优机制27815.6.4Tux的调优机制27815.6

32、.5Web服务器的性能评价工具27815.7小结27915.8参考文献279第16章文件与打印服务器的性能调优28116.1引言28116.2专用网络存储服务器的类型28216.3网络存储性能的优化方法28216.3.1确定远程存储的数据28216.3.2SAN与网络文件系统/NAS28216.3.3网络文件系统协议28316.3.4客户与服务器的实现选择28616.3.5Linux客户端调优的关键概念28716.3.6Linux文件服务器的调优机制29016.3.7性能测量29216.3.8改进容量规划的负荷测量方法29216.3.9打印服务器的性能因素29316.4参考文献293第17章数

33、据库服务器的性能调优29517.1引言29517.2数据库体系结构29517.3数据库的性能调优领域29617.3.1I/O调优29617.3.2队列长度与响应时间29617.3.3负载平衡29717.3.4全局内存29817.3.5日志设备29917.3.6典型的数据库工作负荷30017.4进程管理30017.5内存管理30117.6I/O管理30217.6.1回弹缓冲区30217.6.2原始I/O30217.6.3向量I/O30317.6.4异步I/O30317.6.5直接I/O30317.6.6块I/O30417.6.7I/O请求锁30417.7小结304第18章应用服务器的性能调优30

34、518.1引言30518.2应用服务器概念30518.3Java、J2EE与应用服务器30518.4应用服务器的性能特征30718.4.1应用服务器的特征30818.4.2Linux上的应用服务器30818.5性能与高可用性的改进31618.5.1SMP扩展性31618.5.2集群31718.5.3拓扑结构31918.5.4性能调优32218.6小结32418.7参考文献325第部分调优案例分析第19章Linux2.6内核I/O调度器调优案例分析32919.1引言32919.2基准测试环境与工作负荷概况33019.3I/O调度器与性能33119.4单CPU单磁盘配置33119.58路RAID-

35、5配置33219.616路RAID-0配置33519.7AS串行读性能33519.8AS与Deadline的性能33619.9CFQ性能33719.10小结33919.11参考文献339第20章文件系统调优实例分析34120.1引言34120.2文件布局分析34120.2.1Ext2/Ext3文件系统布局34120.2.2日志文件系统(JFS)布局34720.2.3ReiserFS文件系统布局34920.2.4XFS文件系统布局35120.3文件系统的调优机制35320.3.1Ext3的外部日志调优选项35320.3.2ReiserFS的外部日志调优选项35720.3.3JFS的外部日志调优选

36、项35820.3.4XFS的调优选项35920.4I/O的测量方法36120.4.1iostat36120.4.2iostat与sar工具36220.5小结36720.6参考文献367第21章Linux系统网络性能实例分析36921.1引言36921.2实例分析中使用的基准测试36921.2.1NetBench37021.2.2Netperf337021.2.3VolanoMark37021.2.4SPECWeb9937021.3Linux2.4与2.6内核中的增强机制37121.3.1SendFile37121.3.2TCP分段卸载37321.3.3网络负荷中的进程与IRQ亲合性37521.

37、3.4NAPI37621.3.5TCP卸载引擎37821.4示例分析37921.4.1NetBench38021.4.2Netperf3(千兆位以太网调优实例分析)38121.4.3VolanoMark38321.4.4SPECWeb9938421.5小结38621.6参考文献387第22章商用负载调优实例分析38922.1引言38922.2商用负载调优概述38922.3J2EE的标准商用负载模型39022.4商用负载模型实例:股票交易39022.4.1系统配置39122.4.2Trade3的详细信息39222.4.3性能分析方法39522.5性能分析试验39722.5.1Web服务器3982

38、2.5.2数据库后端程序39922.5.3Java虚拟机40422.5.4应用服务器40622.5.5超线程40822.6小结40922.7参考文献410附录A内核参数调优411A.1引言411A.2sysctl接口411A.3procfs接口412A.4sysfs(只针对Linux2.6内核)413A.5通用内核参数413A.5.1共享内存413A.5.2进程414A.5.3信号414A.5.4概要分析/调试414A.5.5系统414A.6虚存参数415A.7文件系统参数416A.8网络内核参数417A.8.1网络核心参数418A.8.2ICMP418A.8.3邻居419A.8.4配置419

39、A.8.5路由420A.8.6TCP420A.8.7IP分段421第2章作者:BadriPulavartiLinux内核机制2.1引言虽然读者已经对如何在硬件系统上安装Linux做出了一些重要决策,但还需要了解更多关于Linux内核的知识,这样才能制定出重要的调优决策。本章将讨论Linux的发展历程,然后研究其体系结构。还将介绍关于内核组织结构、内核职责以及如何实施内存管理的知识,讨论进程管理和进程间通信的机制,然后简要说明Linux对称多处理模型。最后分析Linux的文件系统。2.2Linux的发展历程Linux是LinusTorvalds于1991年开发的一种个人计算机操作系统。最初,Li

40、nux只支持Intel80 x86处理器。但这些年来,通过添加大量支持功能,Linux已可以在其他处理器上运行。目前,Linux是极少数能够在众多类型的处理器上运行的操作系统之一,支持的处理器包括IntelIA-32、IntelIA-64、AMD、DEC、PowerPC、Motorola、SPARC和IBMS/390等。Linux借鉴了UNIX的许多思想,并实现了UNIX的API函数,因此这两种操作系统有很多相似之处,但Linux并不是任何特定UNIX版本的直接衍生品。Linux无疑是当今发展最快的操作系统,其应用领域从嵌入式设备直至大型机。关于Linux的一个有趣且最重要的事实是其开源性。L

41、inux内核使用的是GNU通用公共许可证(GeneralPublicLicense,GPL),因此用户可以免费获取其内核源码并根据实际需求对其进行修改。下一节将全面介绍Linux内核的体系结构。2.3Linux内核体系结构本节首先讨论Linux内核的体系结构,包括内核的职能、内核的组织结构和模块、内核提供的服务以及进程管理等。2.3.1内核的职能内核(也称为操作系统)有如下两个主要作用:与系统的硬件设备进行交互并对其加以控制。为应用程序提供运行环境。某些操作系统允许应用程序直接访问硬件设备,但这种能力目前已经很少见。类UNIX操作系统向应用程序隐藏了所有的低层硬件细节。应用程序如果希望使用某个

42、硬件资源,就必须向操作系统发出请求。操作系统对该请求进行评估,并在请求有效时代表应用程序与硬件设备进行交互。为了实施这种机制,操作系统依赖于硬件设备禁止与应用程序直接交互的能力。2.3.2内核组织结构与模块与其他许多类UNIX操作系统相似,Linux是单内核(monolithic)结构。这意味着虽然Linux被划分成控制系统各种组件(例如内存管理和进程管理)的多个子系统,但所有的子系统都紧密集成在一起,从而构成整个内核。与之相反,微内核(microkernel)操作系统提供了最少量的功能集合,而所有其他的操作系统层次都在微内核之上以进程方式执行。由于各个层次之间存在着消息传递,微内核操作系统的

43、效率通常较低,但这类操作系统非常便于扩展。Linux内核可通过模块方式进行扩展。模块具有既提供了微内核的优点却又没有额外开销的内核特性。模块是一种可以在系统运行时链接到内核的对象。2.3.3内核服务内核为在用户模式中运行的应用程序提供了一组与系统进行交互的接口。这些接口也称为系统调用,应用程序可以通过接口访问硬件和其他内核资源。系统调用不仅为应用程序提供了抽象化的硬件层次,还确保了系统的安全和稳定性。大多数应用程序并不直接使用系统调用。相反,在编程时采用了应用程序接口(API)。需要注意的是,在API和系统调用之间不存在关联。API是作为库文件的组成部分提供给应用程序使用的,这些API一般通过

44、一个或多个系统调用来实现。2.3.4/proc文件系统的外部性能视图/proc文件系统为用户提供了关于内核内部数据结构的视图。可以利用它查看和修改内核的某些内部数据结构,从而改变内核(原文错误:kernal)的行为。/proc文件系统提供了一种通过微调系统资源来改善应用程序以及系统整体性能的简单方法。/proc文件系统是一种由内核以动态创建方式生成数据的虚拟文件系统。它被组织成多种目录形式,其中每个目录都对应于特定子系统的可调选项。附录A详细阐述了使用/proc文件系统对系统进行微调的方法。Linux的另一个要素是内存管理。下一节将从5个方面介绍Linux的内存管理。2.3.5内存管理Linu

45、x的内存管理问题包括地址空间、物理内存、内存映射、分页机制及交换机制。1.地址空间虚存的优点之一是每个进程都认为自己拥有所需的全部地址空间。虚存的大小可以是系统中物理内存大小的许多倍。系统中的每个进程都有自己的虚址空间,这些虚址空间相互之间完全独立。运行某个应用程序的进程不会影响到其他进程,应用程序之间也是相互保护的。虚址空间由操作系统映射至物理内存。从应用程序的角度来说,这个地址空间是一个线性的平面地址空间;但内核对用户虚址空间的处理则有很大的不同。线性地址空间被划分为两部分:用户地址空间和内核地址空间。用户地址空间不会在每次发生上下文切换时都改变,而内核地址空间则始终保持不变。为用户空间和

46、内核空间分配的空间容量主要取决于系统是32位还是64位的体系结构。例如,x86是32位的体系结构,它只支持4GB的地址空间,其中3GB为用户空间保留,1GB分配给内核地址空间。具体的划分大小由内核配置变量PAGE_OFFSET决定。2.物理内存为了支持多种体系结构,Linux使用与体系结构无关的方式来描述物理内存。物理内存可以组织成内存体(bank)的结构,每个内存体与处理器的距离都是特定的。随着越来越多的机器采用非一致性内存访问(NonuniformMemoryAccess,NUMA)技术,这种类型的内存布局已非常普遍。LinuxVM以节点来表示这种排列方式。每个节点划分为许多称为管理区(z

47、one)的内存块,它们代表了内存中的地址范围。有三种不同的管理区:ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM。例如,x86具有以下内存管理区:ZONE_DMA内存地址的前16MBZONE_NORMAL16MB896MBZONE_HIGHMEM896MB内存结束地址每个管理区都有各自的用途。从前的一些ISA设备对于可以在哪些地址上执行I/O操作具有限制条件,而ZONE_DMA可以消除这些限制。ZONE_NORMAL用于所有的内核操作和分配。它对于系统性能是极为重要的。ZONE_HIGHMEM是系统中其余的内存。需要注意的是,ZONE_HIGHMEM无法用于内核的分配和数据

48、结构,只能用于保存用户数据。3.内存映射为了更好地理解内核内存的映射机制,下面以x86为例加以说明。前文提过,内核只有1GB的虚址空间可用,其他3GB保留给用户空间(原文为kernel,疑是错误?)。内核将ZONE_DMA和ZONE_NORMAL中的物理内存直接映射到其地址空间。这意味着系统中最前面的896MB物理内存被映射到内核虚址空间,从而只剩下128MB的虚址空间。这128MB的虚址空间用于诸如vmalloc和kmap等操作。如果物理内存容量较小(少于1GB),这种映射机制运作良好。然而,目前的所有服务器都支持数十千兆字节的内存。Intel公司在其Pentium处理器中引入了物理地址扩展

49、(PhysicalAddressExtension,PAE)机制,能够支持最多64GB物理内存。前述的内存映射机制使得如何处理高达数十千兆字节的物理内存成为x86Linux的一个主要问题来源。Linux内核按照如下方式处理高端内存(896MB以上的所有内存)原文错:about似应为above):当Linux内核需要寻址高端内存中的某个页面时,通过kmap操作将该页面映射到一个小的虚址空间窗口中,在该页面上执行操作,然后解除对该页面的映射。64位体系结构的地址空间非常巨大,因此这类系统不存在这个问题。4.分页机制虚存可以有多种实现方式,其中最有效的方式是基于硬件的方案。虚址空间被划分成固定大小的

50、内存块,称之为页面。虚存访问通过页表被转换成物理内存地址。为了支持各种体系结构和页面尺寸,Linux采用了三级分页机制。它提供了如下三种页表类型:页面全局目录(PageGlobalDirectory,PGD)页面中层目录(PageMiddleDirectory,PMD)页表(PageTable,PTE)地址转换提供了一种将进程的虚址空间与物理地址空间分离的方法。每个虚存页面都可以在主内存中标记为“存在”或“不存在”。如果进程访问某个不存在的虚存地址,硬件就会产生一个页面错误,并由内核对其进行处理。内核处理该错误时将该页面置于主内存中。在这个过程中,系统可能需要将现有的某个页面替换掉,以便为新页

51、面提供空间。替换策略是分页系统最关键的内容之一。Linux2.6版本修补了以前Linux版本中关于各种页面选择和替换的问题。5.交换机制交换是当主存容量不足时将整个进程移入或移出辅助存储器的过程。由于上下文切换的开销非常大,许多现代的操作系统,包括Linux,都不采用这种方法,而是采用分页机制。在Linux中,交换是在页面层次而不是在进程层次上执行的。交换的主要优点是扩展了进程可用的地址空间。当内核需要释放内存以便为新页面提供空间时,可能需要丢弃一些较少使用的或未用的页面。某些页面因为未被磁盘备份而不容易释放,需要被复制到后备存储器(交换区)中,在必要时还要从后备存储器中读回。交换机制的主要缺

52、点是速度慢。磁盘的读写速度通常都非常缓慢,因此应该尽量消除交换操作。2.4进程管理本节讨论Linux中的进程管理,包括进程、任务、内核线程、调度以及上下文切换。2.4.1进程、任务与内核线程任务只是一种“需要完成的工作的一般性描述”,可以是一个轻权的线程,也可以是一个完整的进程。线程是最轻权的任务实例。在内核中创建线程的成本可能很高,也可能较低,这取决于线程需要拥有的特征。最简单的情形是线程与其父线程共享所有资源,包括代码、数据以及许多内部数据结构,而仅在区分该线程与其他线程上有一点点差异。Linux中的进程是一个“重权的”数据结构。如果有必要的话,多个线程可以在单个进程中运行(并共享该进程的

53、一些资源)。在Linux中,进程只是一个拥有全部重权特征的线程。线程和进程由调度器以相同方式进行调度。内核线程是始终在内核模式中运行且没有用户上下文的线程。内核线程通常针对某个特定功能而存在,很容易在内核中处理它。内核线程经常具有所期望的作用:能够像其他任何进程一样进行调度;当其他进程需要该功能发挥作用时,为这些进程提供实现该功能的目标线程(通过发送信号)。2.4.2调度与上下文切换进程调度是确保每个进程能公平分享CPU的一门科学(有人称之为艺术)。对于“公平”的定义,人们总是存在着不同的看法,因为调度器往往根据并不明显的可见的信息来做出选择。本书后面几章中将更深入地阐述进程调度。需要注意的是

54、,许多Linux用户都认为,一个在所有时候大部分正确的调度器要比一个在大多数时候完全正确的调度器更为重要,即缓慢运行的进程要优于因过于精心选择调度策略或错误而停止运行的进程。Linux当前的调度器程序就遵循了这个原则。当一个进程停止运行,被另一个进程替换时,称为上下文切换。通常,这个操作的开销是很高的,内核程序员和应用程序员总是试图尽量减少系统执行上下文切换的数量。进程可以因为等待某个事件或资源而主动停止运行,或者因为系统决定应将CPU分配给另一个进程而被动地放弃运行。对于第一种情况,如果没有其他进程等待执行,CPU实际上可能进入空闲状态。在第二种情况下,该进程或者被另一个等待进程所替换,或者

55、分配到一个新的运行时间片或时间周期继续执行。即使在某个进程正按照有序的方式调度和执行时,也可以被其他更高优先级的任务中断。例如,假若磁盘为磁盘读操作准备好了数据后,就向CPU发送信号,并期望CPU从磁盘上获取数据。内核必须及时地处理这个情况,否则就会降低磁盘的传输率。信号、中断和异常是不同的异步事件,但在许多方面却类似,并且即使CPU已处于忙状态,它们也都必须被迅速处理。例如,准备好了数据的磁盘会导致一个中断。内核调用该特定设备的中断处理程序,中断当前运行的进程并使用其众多资源。当中断处理程序执行结束后,当前运行的进程恢复执行。这实际上是侵占当前运行进程的CPU时间,因为当前版本的内核只测量自

56、从该进程进入CPU之后所经过的时间,却忽略了中断会耗用该进程的宝贵时间这一事实。中断处理程序通常是非常快速和简洁的,因而能够快速处理和清除以便使后续数据能够进入。但有时一个中断可能需要处理的工作比在中断处理程序中所期望的短时间内完成的工作更多。中断也需要一个定义良好的环境来完成其工作(要记住,中断利用了某个随机进程的资源)。在这种情况下,要收集足够信息,将工作延迟提交至bottomhalf处理程序进行处理。bottomhalf处理程序会不时地被调度执行。尽管在Linux早期版本中普遍使用了bottomhalf机制,但当前的Linux版本中不鼓励使用这种机制。2.5进程间通信为了允许进程间可以互

57、相进行通信,Linux支持许多进程间通信(InterProcessCommunication,IPC)机制。信号(signal)和管道(pipe)是两种基本机制,但Linux也支持系统V的IPC机制。2.5.1信号信号用于将事件通知给一个或多个进程,是用户进程间一种原始的通信和同步方式。信号也可用于作业控制。内核能够产生一组已定义的信号,系统中的其他进程如果拥有适当的权限,也可以产生信号。进程可以忽略所生成的大多数信号,但有两个例外:SIGSTOP和SIGKILL。SIGSTOP信号导致进程终止执行,而SIGKILL信号导致进程退出并被忽略掉。除了SIGSTOP和SIGKILL信号之外,进程可

58、以决定如何处理其他各种信号。例如,进程可以阻塞信号,也可以自已处理信号或允许内核处理信号。如果由内核处理信号的话,那么内核执行该信号的默认动作。Linux保存了关于每个进程如何处理各种可能信号的信息。信号并不是在生成之后就会立即传递给进程,而是当该进程恢复运行时才被传递。每当进程退出一个系统调用时,如果存在着任何未被阻塞的信号,这些信号都会被传递。Linux与POSIX标准兼容,因此进程可以指定当调用特定的信号处理例程时需要阻塞哪些信号。2.5.2管道管道是未结构化的先进先出(first-infirst-out,FIFO)单向数据流。写入者向管道的一端添加数据,读取者从管道的另一端获取数据,而

59、已读取的数据会从管道中删除。管道提供了简单的流控制机制。例如,以下命令将ls命令(列出目录中的文件)的输出结果通过管道连至less命令(标记文件的页码)的标准输入中:$ls|lessLinux还支持命名管道(namedpipe)。与管道不同,命名管道不是临时对象,而是文件系统中可以通过mkfifo命令创建的实体。2.5.3系统V的IPC机制Linux支持的3种进程间通信机制,最初出现在UNIX系统V(1983年)中。这3种机制是消息队列、信号量(semaphore)和共享内存。这些机制都共享通用的认证方法。进程只需通过系统调用将唯一的访问标识符传递给内核,就可以访问这些资源。对这些系统VIPC

60、对象的访问要通过访问许可检查,这非常类似检查文件访问的方式。系统VIPC对象的访问权限由该对象的创建者通过系统调用进行设置。1.消息队列消息队列允许一个或多个进程向其中写入消息,然后这些消息将由一个或多个读出进程读取。消息队列在功能上等同于管道,但与管道相比,消息队列更为通用,并有多方面的优势。消息队列通过消息而不是未格式化的字节流形式来传递数据,从而更易于处理数据;消息可以与类型相关联,因此接收者可以在处理非紧急消息之前检查紧急消息;当多个进程共享同一个消息队列时,类型域也可用于指定具体接收者。2.信号量信号量是支持原子操作set和test的一些对象,用于实现各种同步协议。信号量最适于被描述

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论