导航:首页 > 配服务器 > 高性能服务器为什么需要内存池

高性能服务器为什么需要内存池

发布时间:2023-07-02 14:52:22

① 什么叫虚拟存储器怎么样确定虚拟存储器的容量

随着围绕数字化、网络化开展的各种多媒体处理业务的不断增加,存储系统网络平台已经成为一个核心平台,同时各种应用对平台的要求也越来越高,不光是在存储容量上,还包括数据访问性能、数据传输性能、数据管理能力、存储扩展能力等等多个方面。可以说,存储网络平台的综合性能的优劣,将直接影响到整个系统的正常运行。

为达到这些要求,一种新兴的技术正越来越受到大家的关注,即虚拟存储技术。

其实虚拟化技术并不是一件很新的技术,它的发展,应该说是随着计算机技术的发展而发展起来的,最早是始于70年代。由于当时的存储容量,特别是内存容量成本非常高、容量也很小,对于大型应用程序或多程序应用就受到了很大的限制。为了克服这样的限制,人们就采用了虚拟存储的技术,最典型的应用就是虚拟内存技术。随着计算机技术以及相关信息处理技术的不断发展,人们对存储的需求越来越大。这样的需求刺激了各种新技术的出现,比如磁盘性能越来越好、容量越来越大。但是在大量的大中型信息处理系统中,单个磁盘是不能满足需要,这样的情况下存储虚拟化技术就发展起来了。在这个发展过程中也由几个阶段和几种应用。首先是磁盘条带集(RAID,可带容错)技术,将多个物理磁盘通过一定的逻辑关系集合起来,成为一个大容量的虚拟磁盘。而随着数据量不断增加和对数据可用性要求的不断提高,又一种新的存储技术应运而生,那就是存储区域网络(SAN)技术。SAN的广域化则旨在将存储设备实现成为一种公用设施,任何人员、任何主机都可以随时随地获取各自想要的数据。目前讨论比较多的包括iSCSI、FC Over IP 等技术,由于一些相关的标准还没有最终确定,但是存储设备公用化、存储网络广域化是一个不可逆转的潮流。

一、虚拟存储的概念

所谓虚拟存储,就是把多个存储介质模块(如硬盘、RAID)通过一定的手段集中管理起来,所有的存储模块在一个存储池(Storage Pool)中得到统一管理,从主机和工作站的角度,看到就不是多个硬盘,而是一个分区或者卷,就好象是一个超大容量(如1T以上)的硬盘。这种可以将多种、多个存储设备统一管理起来,为使用者提供大容量、高数据传输性能的存储系统,就称之为虚拟存储。

二、虚拟存储的分类

目前虚拟存储的发展尚无统一标准,从虚拟化存储的拓扑结构来讲主要有两种方式:即对称式与非对称式。对称式虚拟存储技术是指虚拟存储控制设备与存储软件系统、交换设备集成为一个整体,内嵌在网络数据传输路径中;非对称式虚拟存储技术是指虚拟存储控制设备独立于数据传输路径之外。从虚拟化存储的实现原理来讲也有两种方式;即数据块虚拟与虚拟文件系统。具体如下:

1.对称式虚拟存储

图1对称式虚拟存储解决方案的示意图

在图1所示的对称式虚拟存储结构图中,存储控制设备 High Speed Traffic Directors(HSTD)与存储池子系统Storage Pool集成在一起,组成SAN Appliance。可以看到在该方案中存储控制设备HSTD在主机与存储池数据交换的过程中起到核心作用。该方案的虚拟存储过程是这样的:由HSTD内嵌的存储管理系统将存储池中的物理硬盘虚拟为逻辑存储单元(LUN),并进行端口映射(指定某一个LUN能被哪些端口所见),主机端将各可见的存储单元映射为操作系统可识别的盘符。当主机向SAN Appliance写入数据时,用户只需要将数据写入位置指定为自己映射的盘符(LUN),数据经过HSTD的高速并行端口,先写入高速缓存,HSTD中的存储管理系统自动完成目标位置由LUN到物理硬盘的转换,在此过程中用户见到的只是虚拟逻辑单元,而不关心每个LUN的具体物理组织结构。该方案具有以下主要特点:

(1)采用大容量高速缓存,显着提高数据传输速度。

缓存是存储系统中广泛采用的位于主机与存储设备之间的I/O路径上的中间介质。当主机从存储设备中读取数据时,会把与当前数据存储位置相连的数据读到缓存中,并把多次调用的数据保留在缓存中;当主机读数据时,在很大几率上能够从缓存中找到所需要的数据。直接从缓存上读出。而从缓存读取数据时的速度只受到电信号传播速度的影响(等于光速),因此大大高于从硬盘读数据时盘片机械转动的速度。当主机向存储设备写入数据时,先把数据写入缓存中,待主机端写入动作停止,再从缓存中将数据写入硬盘,同样高于直接写入硬盘的速度

(2)多端口并行技术,消除了I/O瓶颈。

传统的FC存储设备中控制端口与逻辑盘之间是固定关系,访问一块硬盘只能通过控制它的控制器端口。在对称式虚拟存储设备中,SAN Appliance的存储端口与LUN的关系是虚拟的,也就是说多台主机可以通过多个存储端口(最多8个)并发访问同一个LUN;在光纤通道100MB/带宽的大前提下,并行工作的端口数量越多,数据带宽就越高。

(3)逻辑存储单元提供了高速的磁盘访问速度。

在视频应用环境中,应用程序读写数据时以固定大小的数据块为单位(从512byte到1MB之间)。而存储系统为了保证应用程序的带宽需求,往往设计为传输512byte以上的数据块大小时才能达到其最佳I/O性能。在传统SAN结构中,当容量需求增大时,唯一的解决办法是多块磁盘(物理或逻辑的)绑定为带区集,实现大容量LUN。在对称式虚拟存储系统中,为主机提供真正的超大容量、高性能LUN,而不是用带区集方式实现的性能较差的逻辑卷。与带区集相比,Power LUN具有很多优势,如大块的I/O block会真正被存储系统所接受,有效提高数据传输速度;并且由于没有带区集的处理过程,主机CPU可以解除很大负担,提高了主机的性能。

(4)成对的HSTD系统的容错性能。

在对称式虚拟存储系统中,HSTD是数据I/O的必经之地,存储池是数据存放地。由于存储池中的数据具有容错机制保障安全,因此用户自然会想到HSTD是否有容错保护。象许多大型存储系统一样,在成熟的对称式虚拟存储系统中,HSTD是成对配制的,每对HSTD之间是通过SAN Appliance内嵌的网络管理服务实现缓存数据一致和相互通信的。

(5)在SAN Appliance之上可方便的连接交换设备,实现超大规模Fabric结构的SAN。

因为系统保持了标准的SAN结构,为系统的扩展和互连提供了技术保障,所以在SAN Appliance之上可方便的连接交换设备,实现超大规模Fabric结构的SAN。

2.非对称式虚拟存储系统

图2非对称式虚拟存储系统示意图

在图2所示的非对称式虚拟存储系统结构图中,网络中的每一台主机和虚拟存储管理设备均连接到磁盘阵列,其中主机的数据路径通过FC交换设备到达磁盘阵列;虚拟存储设备对网络上连接的磁盘阵列进行虚拟化操作,将各存储阵列中的LUN虚拟为逻辑带区集(Strip),并对网络上的每一台主机指定对每一个Strip的访问权限(可写、可读、禁止访问)。当主机要访问某个Strip时,首先要访问虚拟存储设备,读取Strip信息和访问权限,然后再通过交换设备访问实际的Strip中的数据。在此过程中,主机只会识别到逻辑的Strip,而不会直接识别到物理硬盘。这种方案具有如下特点:

(1)将不同物理硬盘阵列中的容量进行逻辑组合,实现虚拟的带区集,将多个阵列控制器端口绑定,在一定程度上提高了系统的可用带宽。

(2)在交换机端口数量足够的情况下,可在一个网络内安装两台虚拟存储设备,实现Strip信息和访问权限的冗余。

但是该方案存在如下一些不足:

(1)该方案本质上是带区集——磁盘阵列结构,一旦带区集中的某个磁盘阵列控制器损坏,或者这个阵列到交换机路径上的铜缆、GBIC损坏,都会导致一个虚拟的LUN离线,而带区集本身是没有容错能力的,一个LUN的损坏就意味着整个Strip里面数据的丢失。

(2)由于该方案的带宽提高是通过阵列端口绑定来实现的,而普通光纤通道阵列控制器的有效带宽仅在40MB/S左右,因此要达到几百兆的带宽就意味着要调用十几台阵列,这样就会占用几十个交换机端口,在只有一两台交换机的中小型网络中,这是不可实现的。

(3)由于各种品牌、型号的磁盘阵列其性能不完全相同,如果出于虚拟化的目的将不同品牌、型号的阵列进行绑定,会带来一个问题:即数据写入或读出时各并发数据流的速度不同,这就意味着原来的数据包顺序在传输完毕后被打乱,系统需要占用时间和资源去重新进行数据包排序整理,这会严重影响系统性能。

3.数据块虚拟与虚拟文件系统

以上从拓扑结构角度分析了对称式与非对称式虚拟存储方案的异同,实际从虚拟化存储的实现原理来讲也有两种方式;即数据块虚拟与虚拟文件系统。

数据块虚拟存储方案着重解决数据传输过程中的冲突和延时问题。在多交换机组成的大型Fabric结构的SAN中,由于多台主机通过多个交换机端口访问存储设备,延时和数据块冲突问题非常严重。数据块虚拟存储方案利用虚拟的多端口并行技术,为多台客户机提供了极高的带宽,最大限度上减少了延时与冲突的发生,在实际应用中,数据块虚拟存储方案以对称式拓扑结构为表现形式。

虚拟文件系统存储方案着重解决大规模网络中文件共享的安全机制问题。通过对不同的站点指定不同的访问权限,保证网络文件的安全。在实际应用中,虚拟文件系统存储方案以非对称式拓扑结构为表现形式。

三、虚拟存储技术的实现方式

目前实现虚拟存储主要分为如下几种:

1.在服务器端的虚拟存储

服务器厂商会在服务器端实施虚拟存储。同样,软件厂商也会在服务器平台上实施虚拟存储。这些虚拟存储的实施都是通过服务器端将镜像映射到外围存储设备上,除了分配数据外,对外围存储设备没有任何控制。服务器端一般是通过逻辑卷管理来实现虚拟存储技术。逻辑卷管理为从物理存储映射到逻辑上的卷提供了一个虚拟层。服务器只需要处理逻辑卷,而不用管理存储设备的物理参数。

用这种构建虚拟存储系统,服务器端是一性能瓶颈,因此在多媒体处理领域几乎很少采用。

2.在存储子系统端的虚拟存储

另一种实施虚拟的地方是存储设备本身。这种虚拟存储一般是存储厂商实施的,但是很可能使用厂商独家的存储产品。为避免这种不兼容性,厂商也许会和服务器、软件或网络厂商进行合作。当虚拟存储实施在设备端时,逻辑(虚拟)环境和物理设备同在一个控制范围中,这样做的益处在于:虚拟磁盘高度有效地使用磁盘容量,虚拟磁带高度有效地使用磁带介质。

在存储子系统端的虚拟存储设备主要通过大规模的RAID子系统和多个I/O通道连接到服务器上,智能控制器提供LUN访问控制、缓存和其他如数据复制等的管理功能。这种方式的优点在于存储设备管理员对设备有完全的控制权,而且通过与服务器系统分开,可以将存储的管理与多种服务器操作系统隔离,并且可以很容易地调整硬件参数。

3.网络设备端实施虚拟存储

网络厂商会在网络设备端实施虚拟存储,通过网络将逻辑镜像映射到外围存储设备,除了分配数据外,对外围存储设备没有任何控制。在网络端实施虚拟存储具有其合理性,因为它的实施既不是在服务器端,也不是在存储设备端,而是介于两个环境之间,可能是最“开放”的虚拟实施环境,最有可能支持任何的服务器、操作系统、应用和存储设备。从技术上讲,在网络端实施虚拟存储的结构形式有以下两种:即对称式与非对称式虚拟存储。

从目前的虚拟存储技术和产品的实际情况来看,基于主机和基于存储的方法对于初期的采用者来说魅力最大,因为他们不需要任何附加硬件,但对于异构存储系统和操作系统而言,系统的运行效果并不是很好。基于互联设备的方法处于两者之间,它回避了一些安全性问题,存储虚拟化的功能较强,能减轻单一主机的负载,同时可获得很好的可扩充性。

不管采用何种虚拟存储技术,其目的都使为了提供一个高性能、安全、稳定、可靠、可扩展的存储网络平台,满足节目制作网络系统的苛刻要求。根据综合的性能价格比来说,一般情况下,在基于主机和基于存储设备的虚拟存储技术能够保证系统的数据处理能力要求时,优先考虑,因为这两种虚拟存储技术构架方便、管理简单、维护容易、产品相对成熟、性能价格比高。在单纯的基于存储设备的虚拟存储技术无法保证存储系统性能要求的情况下,我们可以考虑采用基于互连设备的虚拟存储技术。

四、虚拟存储的特点

虚拟存储具有如下特点:

(1)虚拟存储提供了一个大容量存储系统集中管理的手段,由网络中的一个环节(如服务器)进行统一管理,避免了由于存储设备扩充所带来的管理方面的麻烦。例如,使用一般存储系统,当增加新的存储设备时,整个系统(包括网络中的诸多用户设备)都需要重新进行繁琐的配置工作,才可以使这个“新成员”加入到存储系统之中。而使用虚拟存储技术,增加新的存储设备时,只需要网络管理员对存储系统进行较为简单的系统配置更改,客户端无需任何操作,感觉上只是存储系统的容量增大了。

(2)虚拟存储对于视频网络系统最有价值的特点是:可以大大提高存储系统整体访问带宽。存储系统是由多个存储模块组成,而虚拟存储系统可以很好地进行负载平衡,把每一次数据访问所需的带宽合理地分配到各个存储模块上,这样系统的整体访问带宽就增大了。例如,一个存储系统中有4个存储模块,每一个存储模块的访问带宽为50MBps,则这个存储系统的总访问带宽就可以接近各存储模块带宽之和,即200MBps。

(3)虚拟存储技术为存储资源管理提供了更好的灵活性,可以将不同类型的存储设备集中管理使用,保障了用户以往购买的存储设备的投资。

(4)虚拟存储技术可以通过管理软件,为网络系统提供一些其它有用功能,如无需服务器的远程镜像、数据快照(Snapshot)等。

五、虚拟存储的应用 由于虚拟存储具有上述特点,虚拟存储技术正逐步成为共享存储管理的主流技术,其应用具体如下:

1.数据镜像

数据镜像就是通过双向同步或单向同步模式在不同的存储设备间建立数据复本。一个合理的解决方案应该能在不依靠设备生产商及操作系统支持的情况下,提供在同一存储阵列及不同存储阵列间制作镜像的方法。

2.数据复制

通过IP地址实现的远距离数据迁移(通常为异步传输)对于不同规模的企业来说,都是一种极为重要的数据灾难恢复工具。好的解决方案不应当依赖特殊的网络设备支持,同时,也不应当依赖主机,以节省企业的管理费用。

3.磁带备份增强设备

过去的几年,在磁带备份技术上鲜有新发展。尽管如此,一个网络存储设备平台亦应能在磁带和磁盘间搭建桥路,以高速、平稳、安全地完成备份工作。

4.实时复本

出于测试、拓展及汇总或一些别的原因,企业经常需要制作数据复本。

5.实时数据恢复

利用磁带来还原数据是数据恢复工作的主要手段,但常常难以成功。数据管理工作其中一个重要的发展新方向是将近期内的备分数据(可以是数星期前的历史数据)转移到磁盘介质,而非磁带介质。用磁盘恢复数据就象闪电般迅速(所有文件能在60秒内恢复),并远比用磁带恢复数据安全可靠。同时,整卷(Volume)数据都能被恢复。

6.应用整合

存储管理发展的又一新方向是,将服务贴近应用。没有一个信息技术领域的管理人员会单纯出于对存储设备的兴趣而去购买它。存储设备是用来服务于应用的,比如数据库,通讯系统等等。通过将存储设备和关键的企业应用行为相整合,能够获取更大的价值,同时,大大减少操作过程中遇到的难题。

7.虚拟存储在数字视频网络中的应用

现在我着重介绍虚拟存储在数字视频网络中的应用。

数字视频网络对广播电视行业来说已经不是一个陌生的概念了,由于它在广播电视技术数字化进程中起到了重要的作用,国内各级电视台对其给予极大的关注,并且开始构造和应用这类系统,在数字视频网的概念中完全打破了以往一台录象机、一个编辑系统、一套播出系统的传统结构,而代之以上载工作站、编辑制作工作站、播出工作站及节目存储工作站的流程,便于操作和管理。节目上载、节目编辑、节目播出在不同功能的工作站上完成,可成倍提高工作效率。同时,由于采用非线性编辑系统,除了采集时的压缩损失外。信号在制作、播出过程中不再有任何损失,节目的技术质量将大大提高。

在现有的视频网络系统中,虽然电脑的主频、网络的传输速率以及交换设备的性能,已经可以满足绝大多数应用的要求,但其中存储设备的访问带宽问题成为了系统的一个主要性能瓶颈。视频编辑、制作具有数据量存储大、码流高、实时性强、安全性重要等特点。这就要求应用于视频领域的存储技术和产品必须具有足够的带宽并且稳定性要好。

在单机应用时,为了保证一台编辑站点有足够的数据带宽,SCSI技术、本地独立磁盘冗余阵例RAID(Rendant Array of Independent Disks)技术(包括软件和硬件)被广泛应用,它通过把若干个SCSI硬盘加上控制器组成一个大容量,快速响应,高可靠性的存储子系统,从用户看可作为一个逻辑盘或者虚拟盘,从而大大提高了数据传输率和存储容量,同时利用纠错技术提高了存储的可靠性,并可满足带宽要求。

随着节目制作需求的发展,要求2—3台站点共享编辑数据。这时可利用SCSI网络技术实现这一要求。几台编辑站点均配置高性能的SCSI适配器,连接至共享的SCSI磁盘阵列,既可以实现几个站点共享数据,又可以保证每一台单机的工作带宽。

光纤通道技术的成熟应用对视频网络的发展具有里程碑的意义,从此主机与共享存储设备之间的连接距离限制从几米、十几米,扩展到几百米、几千米,再配合光纤通道交换设备,网络规模得到几倍、十几倍的扩充。这时候的FC(Fibre Channel光纤通道)磁盘阵列——RAID容错技术、相对SCSI的高带宽、大容量,成为视频网络中的核心存储设备。

随着电视台规模的发展,全台级大规模视频网络的应用被提出。在这种需求下,就必须将更先进的存储技术与产品引入视频领域。存储区域网(SAN)的发展目前正处于全速上升期,各种概念层出不穷。其中具有划时代意义的是虚拟存储概念的提出。相对于传统的交换机加RAID阵列,主机通过硬件层直接访问阵列中的硬盘的SAN结构,虚拟存储的定位是将数据存储功能从实际的、物理的数据存取过程中抽象出来,使普通用户在访问数据时不必关心具体的存储设备的配置参数、物理位置及容量,从而简化用户和系统管理人员的工作难度。

在设计一个视频网络系统的时候,对存储系统的选用,主要考虑如下几个因素:(1)总体带宽性能;(2)可管理性;(3)安全性;(4)可扩展性;(5)系统成本。

当然,这些因素之间有时是相互制约的,特别是系统成本与性能和安全性的关系。如何在这些因素之间寻求合理的、实用的、经济的配合,是一个需要解决的课题。虚拟存储技术的出现,为我们在构建视频网络系统时提供了一个切实可行的高性能价格比的解决方案。

从拓扑结构来讲,对称式的方案具有更高的带宽性能,更好的安全特性,因此比较适合大规模视频网络应用。非对称式方案由于采用了虚拟文件原理,因此更适合普通局域网(如办公网)的应用。

② 怎样提高IIS服务器性能,加快服务器速度

1、应该分配和释放多个对象

你应该尽量避免过量分配内存,因为内存分配可能是代价高昂的。释放内存块可能更昂贵,因为大多数分配算符总是企图连接临近的已释放的内存块成为更大的块。直到Windows NT? 4.0 service pack 4.0,在多线程处理中,系统堆通常都运行得很糟。堆被一个全局锁保护,并且在多处理器系统上是不可扩展的。

2.不应该考虑使用处理器高速缓存

大多数人都知道由虚拟内存子系统导致的hard 页错误代价很高,最好避免。但是许多人认为其他内存访问方法没有什么区别。自从80486以后,这一观点就不对了。现代的CPUs比RAM要快得多,RAM至少需要两级内存缓存 ,高速L1 缓存能保存8KB数据和8KB指令,而较慢的L2 缓存能保存几百KB的数据和代码,这些数据和代码混合在一起。L1 缓存中内存区域的一个引用需要一个时钟周期,L2 缓存的引用需要4到7个时钟周期,而主内存的引用需要许多个处理器时钟周期。后一数字不久将会超过100个时钟周期。在许多方面,缓存像一个小型的,高速的,虚拟内存系统。

至于和缓存有关的基本内存单元不是字节而是缓存列。Pentium 缓存列有32个字节宽。Alpha 缓存列有64个字节宽。这意味着在L1 缓存中只有512个slot给代码和数据。如果多个数据一起使用(时间位置)而并不存储在一起(空间位置),性能会很差。数组的空间位置很好,而相互连接的列表和其他基于指针的数据结构的位置往往很差。

把数据打包到同一个缓存列中通常会有利于提高性能,但是它也会破坏多处理器系统的性能。内存子系统很难协调处理器间的缓存。如果一个被所有处理器使用的只读数据,和一个由一个处理器使用并频繁更新的数据共享一个缓存 列,那么缓存将会花费很长时间更新这个缓存列的拷贝。这个Ping-Pong高速游戏通常被称为"缓存 sloshing"。如果只读数据在一个不同的缓存 列中,就可以避免sloshing。

对代码进行空间优化比进行速度优化效率更高。代码越少,代码所占的页也越少,这样需要的运行设置和产生的页错误也会更少,同时占据的缓存 列也会更少。然而,某些核心函数应该进行速度优化。可以利用profiler去识别这些函数。

3.决不要缓存频繁使用的数据。

软件缓存可以被各种应用程序使用。当一个计算代价很高时,你会保存结果的一个拷贝。这是一个典型的时空折中方法:牺牲一些存储空间以节省时间。如果做得好,这种方法可能非常有效。

你必须正确地进行缓存。如果缓存了错误数据,就会浪费存储空间。如果缓存得太多,其他操作可以使用的内存将会很少。如果缓存得太少,效率又会很低,因为你必须重新计算被缓存 遗漏的数据。如果将时间敏感数据缓存得时间过长,这些数据将会过时。一般,服务器更关心的是速度而不是空间,所以他们要比桌面系统进行更多的缓存。一定要定期去除不用的缓存,否则将会有运行设置问题。

4.应该创建多个线程,越多越好。

调整服务器中起作用的线程数目是很重要的。如果线程是I/O-bound的,将会花费很多时间用来等待I/O的完成-一个被阻塞的线程就是一个不做任何有用工作的线程。加入额外的线程可以增加通量,但是加入过多的线程将会降低服务器的性能,因为上下文交换将会成为一个重大的overhead。上下文交换速度应该低的原因有三个:上下文交换是单纯的overhead,对应用程序的工作没有任何益处;上下文交换用尽了宝贵的时钟周期;最糟的是,上下文交换将处理器的缓存填满了没用的数据,替换这些数据是代价高昂的。

有很多事情是依靠你的线程化结构的。每个客户端一个线程是绝对不合适的。因为对于大量用户端,它的扩展性不好。上下文交换变得难以忍受,Windows NT用尽了资源。线程池模型会工作得更好,在这种方法中一个工人线程池将处理一条请求列,因为Windows 2000提供了相应的APIs,如QueueUserWorkItem。

5.应该对数据结构使用全局锁

使数据线程安全的最简单方法是把它套上一把大锁。为简单起见,所有的东西都用同一把锁。这种方法会有一个问题:序列化。为了得到锁,每一个要处理数据的线程都必须排队等候。如果线程被一把锁阻塞,它没有在做任何有用的事。当服务器的负载较轻时,这个问题并不常见,因为一次可能只有一个线程需要锁。在负载很重的情况下,对锁的激烈争夺可能就会成为一个大问题。

设想在多车道高速公路上发生了一个意外事故,这条高速公路上的所有车辆都被转向一条狭窄的道路。如果车辆很少,这一转换对交通流的速率的影响可以忽略。如果车辆很多,当车辆慢慢并入那条单通道时,交通阻塞会延伸几英里。

有几种技术能够减少锁竞争。

· 不要过分保护,也就是说,不是非常必要不要锁住数据。只有需要时才去持有锁,而且时间不要过长。不要在大段代码周围或频繁执行的代码中没必要地使用锁,这一点很重要。

· 对数据进行分割,使它能够用一套独立的锁保护。例如,一个符号表可以按标识符的第一个字母分割,这样在修改名字以Q开头的符号的值时,就不会去读名字以H开头的符号的值。

· 使用APIs的Interlocked 系列(InterlockedIncrement,等)自动修改数据而不需要锁。

· 当数据不是经常被修改时可以使用多读者/单作者(multi-reader/single-writer)锁。你将获得更好的并发性,尽管锁操作的代价将更高并且你可能会冒饿死作者的危险。

· 在关键部分使用循环计数器。参见Windows NT 4.0 service pack 3中的SetCriticalSectionSpinCount API。

· 如果你不能得到锁,使用TryEnterCriticalSection并做一些其他的有用的工作。

高竞争导致serialization,serialization导致降低CPU的利用率,这促使用户加入更多的线程,结果事情变得更糟。

6.不必注意多处理器机器

你的代码在多处理器系统上比在单处理器系统上运行得还要糟,这可能是件令人恶心的事。一个很自然的想法是,在一个N维系统上运行N次会更好。性能很差的原因是竞争:锁竞争,总线竞争,和/或缓存列竞争。处理器都在是争夺共享资源的所有权,而不是做更多的工作。

如果你一定要编写多线程应用程序的话,你应该在多处理器盒上对你的应用程序进行强度测试和性能测试。单处理器系统通过时间分片地执行线程而提供一个并发性的假象。多处理器盒具有真正的并发性,竞争环境和竞争更容易发生。

7.应该始终使用模块化调用;他们很有趣。

利用同步模块化调用来执行I/O操作对大多数桌面应用程序来说是合适的。但是,他们不是使用服务器上的CPU(s)的好方法。I/O操作要花费上百万个时钟周期来完成,这些时钟周期本来可以被更好地利用。利用异步I/O你能得到显着提高的用户请求率和I/O通量,不过增加了额外的复杂性。

如果你有需要花费很长时间的模块化调用或I/O操作,你应该考调拨多少资源给他们。你想使用所有的线程还是有个限制?一般地,使用有限的几个线程要好些。构建一个小的线程池和队列,利用队列来安排线程的工作完成模块化调用。这样,其他线程就可以拾取和处理你的非模块化的请求。

8.不要进行测量

当你能够测量你所谈论的事情并用数字表达它时,这就表示你对他有了一定的了解;但是如果你不能用数字表达时,你的知识是贫瘠的不能令人满意的;这可能是知识的开始,但这时你简直不可能将你的思想提高到科学的水平。

- Lord Kelvin (William Thomson)

如果不测量你就不能了解应用程序的特性。你在黑暗中摸索,一半是靠猜测。如果不识别性能问题,你就不能做任何改进或做出工作量计划。

测量包括黑匣子测量和profiling。黑匣子测量的意思是收集由性能计数器(内存使用,上下文交换,CPU利用等)和外部检测工具(通量,反映时间等)所显示的数据。为了profile你的代码,你编译代码的一个工具版,然后在各种条件下运行它,并收集关于执行时间和过程调用频率的统计数据。

测量如果不用于分析的话就一点用都没有。测量将不仅告诉你有问题,而且甚至能帮助你找到问题发生在哪,但它不能告诉你为什么会有问题。对问题进行分析以便你能正确地改正他们。要从根本上解决问题而不是停留在表面现象。

当你进行改动后,要重新测量。你要知道你的改动是否有效。改动也可能会暴露其他性能问题,测量-分析-改正-再测量的循环就会重新开始。你也必须要有规律地进行测量,以便发现性能衰退问题。

9.应该使用单一用户,单一请求的测试方法。

书写ASP和ISAPI应用程序的一个通病是只用一个浏览器去测试应用程序。当他们在Internet上应用他们的程序时,他们才发现他们的应用程序不能处理高负载,并且通量和反应时间另人可怜。

用一个浏览器测试是必要的但是不够的。如果浏览器反应得不够快,你就知道你有麻烦了。但即使它在使用一个浏览器时很快,你也不知道它处理负载的能力如何。如果十几个用户同时请求会发生什么事?一百个呢?你的应用程序能容忍什么样的通量?它能提供什么样的反应时间?在轻载时这些数字会怎样?中等负载呢?重载呢?在多处理器机器上你的应用程序会如何?对你的应用程序进行强度测试,这对于找出bugs发现性能问题来说是基本的。

类似的负载测试考虑适用于所有的服务器应用程序。

10.不应使用实际环境。

人们往往只在几个特定的,人工的环境(如下benchmarks)下调整应用程序。选择和实际情况相对应的各种情况,并为针对各种操作进行优化,这一点很重要。如果你不这样做,你的用户和评论家一定会这样做,并且他们将依此来评判你的应用程序的好坏。

linux 系统mysql 服务器内存利用率很高了怎么解决

Linux 进程通过 C 标准库中的内存分配函数 malloc 向系统申请内存,但是到真正与内核交互之间,其实还隔了一层,即内存分配管理器(memory allocator)。常见的内存分配器包括:ptmalloc(Glibc)、tcmalloc(Google)、jemalloc(FreeBSD)。MySQL 默认使用的是 glibc 的 ptmalloc 作为内存分配器。

目前 jemalloc 应用于 Firefox、FaceBook 等,并且是 MariaDB、Redis、Tengine 默认推荐的内存分配器,而 tcmalloc 则应用于 WebKit、Chrome 等。

阅读全文

与高性能服务器为什么需要内存池相关的资料

热点内容
c传递指针到python 浏览:160
手动添加引导的命令 浏览:52
740服务器小蓝条是做什么的 浏览:520
linux文件操作命令 浏览:125
安卓手机图片文件夹加锁 浏览:778
steam提示音在哪个文件夹 浏览:337
项目开发全程实录pdf 浏览:530
单片机reset 浏览:595
pdf怎么是英文 浏览:969
旗云2压缩机保险 浏览:374
做程序员压力大吗表情包 浏览:312
pdf下拉 浏览:371
php去掉小数后面的0 浏览:954
阿里备案买什么服务器 浏览:261
网络驱动下载到哪个文件夹 浏览:481
达内程序员培训西安 浏览:505
人保送车主惠app上怎么年检 浏览:604
android手机开机密码 浏览:481
linux查看某个进程命令 浏览:530
闲置的腾讯云服务器 浏览:439