一、引言
随着信息技术的快速发展,服务器在各个领域的应用越来越广泛。
服务器内存作为服务器运行的关键资源之一,其预留策略对于提高服务器性能、保障业务稳定运行具有重要意义。
本文将探讨不同应用场景下服务器内存的预留策略,以期为读者在实践中提供选择和参考。
二、服务器内存预留策略概述
服务器内存预留策略是指根据服务器所承载的业务特点和性能需求,合理规划和分配内存资源的过程。
有效的内存预留策略可以提高服务器运行效率,减少资源争用,确保业务的高可用性。
在选择内存预留策略时,需考虑以下因素:
1. 业务需求:不同业务场景对内存的需求不同,需要根据实际情况进行规划。
2. 性能要求:内存预留策略应与业务性能要求相匹配,确保服务器在高并发、大数据量等场景下稳定运行。
3. 成本考量:在保障业务正常运行的前提下,应尽量降低内存成本。
三、不同应用场景下的服务器内存预留策略
1. Web服务器场景
Web服务器是处理大量并发请求的关键组件,对内存的需求较高。在Web服务器场景下,内存预留策略应遵循以下原则:
(1)根据网站访问量、并发连接数等因素,合理估算内存需求。
(2)为操作系统、Web服务器软件及其他关键服务预留必要内存。
(3)根据业务需求,为缓存、会话管理等功能分配一定内存。
(4)考虑使用内存优化技术,如使用压缩技术减少内存占用。
2. 数据库服务器场景
数据库服务器负责处理大量数据,对内存的读写性能要求较高。在数据库服务器场景下,内存预留策略应遵循以下原则:
(1)为数据库管理系统预留足够的内存,确保数据库操作的稳定性。
(2)根据数据库类型(如关系型数据库、NoSQL数据库等)和性能需求,合理分配内存资源。
(3)考虑使用内存数据库技术,将部分数据缓存到内存中,提高数据访问速度。
(4)监控内存使用情况,及时调整内存配置,避免资源浪费或不足。
3. 云计算服务场景
云计算服务需要大量服务器支撑,对内存的扩展性和灵活性要求较高。在云计算服务场景下,内存预留策略应遵循以下原则:
(1)采用分布式内存技术,提高内存的可用性和扩展性。
(2)根据虚拟机或容器的资源需求,动态分配内存资源。
(3)监控内存使用情况,实现内存的自动扩展和收缩。
(4)确保云服务平台的安全性和稳定性,合理设置内存访问权限。
4. 高性能计算场景
高性能计算需要处理大量数据和复杂算法,对内存的容量和性能要求极高。在高性能计算场景下,内存预留策略应遵循以下原则:
(1)选择大容量、高性能的内存设备,满足计算需求。
(2)优化内存配置,提高内存的读写性能。
(3)考虑使用并行计算技术,充分利用多核处理器的内存资源。
(4)监控内存使用情况,确保计算任务的稳定运行。
四、结论
服务器内存预留策略对于保障业务稳定运行、提高服务器性能具有重要意义。
在选择内存预留策略时,需根据服务器所承载的业务特点和性能需求进行规划和分配。
本文总结了不同应用场景下的服务器内存预留策略,包括Web服务器、数据库服务器、云计算服务和高性能计算等场景。
在实际应用中,读者可根据自身业务需求选择合适的内存预留策略,并灵活调整和优化配置,以实现最佳的性能和效益。
oracle数据库的后台进程有哪些
DBWR进程:该进程执行将缓冲区写入数据文件,是负责缓冲存储区管理的一个ORACLE后台进程。
当缓冲区中的一缓冲区被修改,它被标志为“弄脏”,DBWR的主要任务是将“弄脏”的缓冲区写入磁盘,使缓冲区保持“干净”。
由于缓冲存储区的缓冲区填入数据库或被用户进程弄脏,未用的缓冲区的数目减少。
当未用的缓冲区下降到很少,以致用户进程要从磁盘读入块到内存存储区时无法找到未用的缓冲区时,DBWR将管理缓冲存储区,使用户进程总可得到未用的缓冲区。
ORACLE采用LRU(LEAST RECENTLY USED)算法(最近最少使用算法)保持内存中的数据块是最近使用的,使I/O最小。
在下列情况预示DBWR 要将弄脏的缓冲区写入磁盘:当一个服务器进程将一缓冲区移入“弄脏”表,该弄脏表达到临界长度时,该服务进程将通知DBWR进行写。
该临界长度是为参数DB-BLOCK-WRITE-BATCH的值的一半。
当一个服务器进程在LRU表中查找DB-BLOCK-MAX-SCAN-CNT缓冲区时,没有查到未用的缓冲区,它停止查找并通知DBWR进行写。
出现超时(每次3秒),DBWR 将通知本身。
当出现检查点时,LGWR将通知DBWR.在前两种情况下,DBWR将弄脏表中的块写入磁盘,每次可写的块数由初始化参数DB-BLOCK- WRITE-BATCH所指定。
如果弄脏表中没有该参数指定块数的缓冲区,DBWR从LUR表中查找另外一个弄脏缓冲区。
如果DBWR在三秒内未活动,则出现超时。
在这种情况下DBWR对LRU表查找指定数目的缓冲区,将所找到任何弄脏缓冲区写入磁盘。
每当出现超时,DBWR查找一个新的缓冲区组。
每次由DBWR查找的缓冲区的数目是为寝化参数DB-BLOCK- WRITE-BATCH的值的二倍。
如果数据库空运转,DBWR最终将全部缓冲区存储区写入磁盘。
在出现检查点时,LGWR指定一修改缓冲区表必须写入到磁盘。
DBWR将指定的缓冲区写入磁盘。
在有些平台上,一个实例可有多个DBWR.在这样的实例中,一些块可写入一磁盘,另一些块可写入其它磁盘。
参数DB-WRITERS控制DBWR进程个数。
LGWR进程:该进程将日志缓冲区写入磁盘上的一个日志文件,它是负责管理日志缓冲区的一个ORACLE后台进程。
LGWR进程将自上次写入磁盘以来的全部日志项输出,LGWR输出:当用户进程提交一事务时写入一个提交记录。
每三秒将日志缓冲区输出。
当日志缓冲区的1/3已满时将日志缓冲区输出。
当DBWR将修改缓冲区写入磁盘时则将日志缓冲区输出。
LGWR进程同步地写入到活动的镜象在线日志文件组。
如果组中一个文件被删除或不可用,LGWR 可继续地写入该组的其它文件。
日志缓冲区是一个循环缓冲区。
当LGWR将日志缓冲区的日志项写入日志文件后,服务器进程可将新的日志项写入到该日志缓冲区。
LGWR 通常写得很快,可确保日志缓冲区总有空间可写入新的日志项。
注意:有时候当需要更多的日志缓冲区时,LWGR在一个事务提交前就将日志项写出,而这些日志项仅当在以后事务提交后才永久化。
ORACLE使用快速提交机制,当用户发出COMMIT语句时,一个COMMIT记录立即放入日志缓冲区,但相应的数据缓冲区改变是被延迟,直到在更有效时才将它们写入数据文件。
当一事务提交时,被赋给一个系统修改号(SCN),它同事务日志项一起记录在日志中。
由于SCN记录在日志中,以致在并行服务器选项配置情况下,恢复操作可以同步。
CKPT进程:该进程在检查点出现时,对全部数据文件的标题进行修改,指示该检查点。
在通常的情况下,该任务由LGWR执行。
然而,如果检查点明显地降低系统性能时,可使CKPT进程运行,将原来由LGWR进程执行的检查点的工作分离出来,由 CKPT进程实现。
对于许多应用情况,CKPT进程是不必要的。
只有当数据库有许多数据文件,LGWR在检查点时明显地降低性能才使CKPT运行。
CKPT进程不将块写入磁盘,该工作是由DBWR完成的。
初始化参数CHECKPOINT-PROCESS控制CKPT进程的使能或使不能。
缺省时为FALSE,即为使不能。
SMON进程:该进程实例启动时执行实例恢复,还负责清理不再使用的临时段。
在具有并行服务器选项的环境下,SMON对有故障CPU或实例进行实例恢复。
SMON进程有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。
PMON进程:该进程在用户进程出现故障时执行进程恢复,负责清理内存储区和释放该进程所使用的资源。
例:它要重置活动事务表的状态,释放封锁,将该故障的进程的ID从活动进程表中移去。
PMON还周期地检查调度进程(DISPATCHER)和服务器进程的状态,如果已死,则重新启动(不包括有意删除的进程)。
PMON有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。
RECO进程:该进程是在具有分布式选项时所使用的一个进程,自动地解决在分布式事务中的故障。
一个结点RECO后台进程自动地连接到包含有悬而未决的分布式事务的其它数据库中,RECO自动地解决所有的悬而不决的事务。
任何相应于已处理的悬而不决的事务的行将从每一个数据库的悬挂事务表中删去。
当一数据库服务器的RECO后台进程试图建立同一远程服务器的通信,如果远程服务器是不可用或者网络连接不能建立时,RECO自动地在一个时间间隔之后再次连接。
RECO后台进程仅当在允许分布式事务的系统中出现,而且DISTRIBUTED ?C TRANSACTIONS参数是大于进程:该进程将已填满的在线日志文件拷贝到指定的存储设备。
当日志是为ARCHIVELOG使用方式、并可自动地归档时ARCH进程才存在。
LCKn进程:是在具有并行服务器选件环境下使用,可多至10个进程(LCK0,LCK1……,LCK9),用于实例间的封锁。
Dnnn进程(调度进程):该进程允许用户进程共享有限的服务器进程(SERVER PROCESS)。
没有调度进程时,每个用户进程需要一个专用服务进程(DEDICATEDSERVER PROCESS)。
对于多线索服务器(MULTI-THREADED SERVER)可支持多个用户进程。
如果在系统中具有大量用户,多线索服务器可支持大量用户,尤其在客户_服务器环境中。
在一个数据库实例中可建立多个调度进程。
对每种网络协议至少建立一个调度进程。
数据库管理员根据操作系统中每个进程可连接数目的限制决定启动的调度程序的最优数,在实例运行时可增加或删除调度进程。
多线索服务器需要SQL*NET版本2或更后的版本。
在多线索服务器的配置下,一个网络接收器进程等待客户应用连接请求,并将每一个发送到一个调度进程。
如果不能将客户应用连接到一调度进程时,网络接收器进程将启动一个专用服务器进程。
该网络接收器进程不是ORACLE实例的组成部分,它是处理与ORACLE有关的网络进程的组成部分。
在实例启动时,该网络接收器被打开,为用户连接到ORACLE建立一通信路径,然后每一个调度进程把连接请求的调度进程的地址给予于它的接收器。
当一个用户进程作连接请求时,网络接收器进程分析请求并决定该用户是否可使用一调度进程。
如果是,该网络接收器进程返回该调度进程的地址,之后用户进程直接连接到该调度进程。
有些用户进程不能调度进程通信(如果使用SQL*NET以前的版本的用户),网络接收器进程不能将如此用户连接到一调度进程。
在这种情况下,网络接收器建立一个专用服务器进程,建立一种合适的连接.即主要的有:DBWR,LGWR,SMON 其他后台进程有PMON,CKPT等
什么是服务器内存?它与普通内存有什么区别?
外观和结构上没有什么明显实质性的区别,主要是在服务器内存上引入了一些新的特有的技术,如ECC、ChipKill、Register、热插拔技术等,具有极高的稳定性和纠错性能。
ECC内存即纠错内存,简单的说,其具有发现错误,纠正错误的功能,一般多应用在高档台式电脑/服务器及图形工作站上,这将使整个电脑系统在工作时更趋于安全稳定。
Chipkill Chipkill技术是IBM公司为了解决目前服务器内存中ECC技术的不足而开发的,是一种新的ECC内存保护标准。
我们知道ECC内存只能同时检测和纠正单一比特错误,但如果同时检测出两个以上比特的数据有错误,则一般无能为力。
目前ECC技术之所以在服务器内存中广泛采用,一则是因为在这以前其它新的内存技术还不成熟,再则在目前的服务器中系统速度还是很高,在这种频率上一般来说同时出现多比特错误的现象很少发生,正因为这样才使得ECC技术得到了充分地认可和应用,使得ECC内存技术成为几乎所有服务器上的内存标准。
Register即寄存器或目录寄存器,在内存上的作用我们可以把它理解成书的目录,有了它,当内存接到读写指令时,会先检索此目录,然后再进行读写操作,这将大大提高服务器内存工作效率。
带有Register的内存一定带Buffer(缓冲),并且目前能见到的Register内存也都具有ECC功能,其主要应用在中高端服务器及图形工作站上,如IBM Netfinity 5000。
如何为Kafka集群选择合适的主题和分区数量
如何决定kafka集群中topic,partition的数量,这是许多kafka用户经常遇到的问题。
本文列举阐述几个重要的决定因素,以提供一些参考。
分区多吞吐量更高一个话题topic的各个分区partiton之间是并行的。
在producer和broker方面,写不同的分区是完全并行的。
因此一些昂贵的操作比如压缩,可以获得更多的资源,因为有多个进程。
在consumer方面,一个分区的数据可以由一个consumer线程在拉去数据。
分区多,并行的consumer(同一个消费组)也可以多。
因此通常,分区越多吞吐量越高。
基于吞吐量可以获得一个粗略的计算公式。
先测量得到在只有一个分区的情况下,Producer的吞吐量(P)和Consumer的吞吐量(C)。
那如果总的目标吞吐量是T的话,max(T/P,T/C)就是需要的最小分区数。
在单分区的情况下,Producer的吞吐量可以通过一些配置参数,比如bath的大小、副本的数量、压缩格式、ack类型来测得。
而Consumer的吞吐量通常取决于应用程序处理每一天消息逻辑。
这些都是需要切合实际测量。
随着时间推移数据量的增长可能会需要增加分区。
有一点需要注意的是,Producer者发布消息通过key取哈希后映射分发到一个指定的分区,当分区数发生变化后,会带来key和分区映射关系发生变化。
可能某些应用程序依赖key和分区映射关系,映射关系变化了,程序就需要做相应的调整。
为了避免这种key和分区关系带来的应用程序修改。
所以在分区的时候尽量提前考虑,未来一年或两年的对分区数据量的要求。
除了吞吐量,还有一些其他的因素,在定分区的数目时是值得考虑的。
在某些情况下,太多的分区也可能会产生负面影响。
分区多需要的打开的文件句柄也多每个分区都映射到broker上的一个目录,每个log片段都会有两个文件(一个是索引文件,另一个是实际的数据文件)。
分区越多所需要的文件句柄也就越多,可以通过配置操作系统的参数增加打开文件句柄数。
分区多增加了不可用风险kafka支持主备复制,具备更高的可用性和持久性。
一个分区(partition)可以有多个副本,这些副本保存在不同的broker上。
每个分区的副本中都会有一个作为Leader。
当一个broker失败时,Leader在这台broker上的分区都会变得不可用,kafka会自动移除Leader,再其他副本中选一个作为新的Leader。
Producer和Consumer都只会与Leader相连。
一般情况下,当一个broker被正常关机时,controller主动地将Leader从正在关机的broker上移除。
移动一个Leader只需要几毫秒。
然当broker出现异常导致关机时,不可用会与分区数成正比。
假设一个boker上有2000个分区,每个分区有2个副本,那这样一个boker大约有1000个Leader,当boker异常宕机,会同时有1000个分区变得不可用。
假设恢复一个分区需要5ms,1000个分区就要5s。
分区越多,在broker异常宕机的情况,恢复所需时间会越长,不可用风险会增加。
分区多会增加点到点的延迟这个延迟需要体现在两个boker间主备数据同步。
在默认情况下,两个boker只有一个线程负责数据的复制。
根据经验,每个boker上的分区限制在100*b*r内(b指集群内boker的数量,r指副本数量)。
分区多会增加客户端的内存消耗kafka0.8.2后有个比较好的特色,新的Producer可以允许用户设置一个缓冲区,缓存一定量的数据。
当缓冲区数据到达设定量或者到时间,数据会从缓存区删除发往broker。
如果分区很多,每个分区都缓存一定量的数据量在缓冲区,很可能会占用大量的内存,甚至超过系统内存。
Consumer也存在同样的问题,会从每个分区拉一批数据回来,分区越多,所需内存也就越大。
根据经验,应该给每个分区分配至少几十KB的内存。
总结 在通常情况下,增加分区可以提供kafka集群的吞吐量。
然而,也应该意识到集群的总分区数或是单台服务器上的分区数过多,会增加不可用及延迟的风险。