一、Linux下的进程性能指标
进程管理在任何操作系统上都是最重要事情。高效的进程管理能够确保应用高效稳定的运行。
Linux的进程管理方式类似于Unix的进程管理方式,包含进程调度、中断处理、信号、进程优先级、进程切换、进程状态、进程的内存等等。
1、进程的概念与分类
进程的的基本定义是:在自身的虚拟地址空间运行的一个独立的程序,从操作系统的角度来看,所有在系统上运行的东西,都可以称为一个进程。内核通过调度各类资源来满足进程的需求。
需要注意的是:程序和进程是有区别的,进程虽然有程序产生,但是它并不是程序,程序是一个进程指令的集合,它可以启用一个或多个进程,同时,程序只占用磁盘空间,而不占用系统运行资源,而进程仅仅占用系统内存空间,是动态的、可变的,关闭进程,占用的内存资源随之释放。
按照进程的功能和运行的程序分类,进程可划分为两大类:
系统进程:可以执行内存资源分配和进程切换等管理工作;而且,该进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。
用户进程:通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。
针对用户进程,又可以分为交互进程、批处理进程和守护进程三类。
交互进程:由一个shell终端启动的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行在后台。
批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。
守护进程:守护进程是一直运行的一种进程,经常在linux系统启动时启动,在系统关闭时终止。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。例如httpd进程,一直处于运行状态,等待用户的访问。还有经常用的crond进程,这个进程类似与windows的计划任务,可以周期性的执行用户设定的某些任务。
2、进程之间的关系
在linux系统中,进程ID(用PID表示)是区分不同进程的唯一标识,它们的大小是有限制的,最大ID为32768,用UID和GID分别表示启动这个进程的用户和用户组。所有的进程都是PID为1的进程的后代,内核在系统启动的最后阶段启动PID为1的进程,因而,这个进程是linux下所有进程的父进程,用PPID表示父进程。
当一个进程创建一个新的进程,创建进程的进程(父进程)使用名为fork()的系统调用,当fork()被调用的时候,它会为新创建的进程(子进程)获得一个进程描述符,并且设置新的进程ID。同时,复制父进程的进程描述符给子进程。这时候,不会复制父进程的地址空间,而是父、子进程使用同样的地址空间。
父进程与子进程之间是管理与被管理的关系,当父进程停止时,子进程也随之消失,但是子进程关闭,父进程不一定终止。当程序执行完成,子进程使用exit()系统调用终止。exit()会释放进程的大部分数据结构,并且把这个终止的消息通知给父进程。这时候,子进程被称为zombie process(僵尸进程)。一旦父进程知道子进程已经终止,它会清除子进程的所有数据结构和进程描述符。
这里会存在一个问题,那就是如果父进程在子进程退出之前就退出,那么所有子进程就变成的一个孤儿进程,如果没有相应的处理机制的话,这些孤儿进程就会一直处于僵死状态,资源无法释放,此时解决的办法是在启动的进程内找一个进程作为这些孤儿进程的父进程,或者直接让pid为1的进程作为它们的父进程,进而释放孤儿进程占用的资源。
3、进程与线程
进程是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命周期。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。
进程和线程的关系如下:
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)进程作为资源分配的最小单位,资源是分配给进程的,同一进程的所有线程共享该进程的所有资源。
(3)真正在处理机上运行的是线程。
进程与线程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行。
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
4、进程优先级和nice级别
Linux是一个多用户多任务的操作系统。所有的任务都放在一个队列中,操作系统根据每个任务的优先级为每个任务分配合适的时间片(时间片是进程在处理器中的执行时间),每个时间片很短,用户根本感觉不到是多个任务在运行,从而使所有的任务共同分享系统资源,因此linux可以在一个任务还未执行完时,暂时挂起此任务,又去执行另一个任务,过一段时间以后再回来处理这个任务,直到这个任务完成,才从任务队列中去除。这就是多任务的概念。
上面说的是单CPU多任务操作系统的情形,在这种环境下,虽然系统可以运行多个任务,但是在某一个时间点,CPU只能执行一个进程(串行执行),而在多CPU多任务的操作系统下,由于有多个CPU,所以在某个时间点上,可以有多个进程同时运行(并行执行)。这就是多核CPU比单核CPU处理性能高的原因。
在CPU执行每个进程任务的过程中,还涉及到一个概念,就是进程的优先级,它是决定进程在CPU中执行顺序的数字。优先级越高的进程被处理器执行的机会越大。
进程优先级由动态优先级和静态优先级决定,根据进程的行为,内核使用启发式算法决定开启或关闭动态优先级。我们可以通过nice级别直接修改进程的静态优先级,拥有越高静态优先级的进程会获得更长的时间片。
Linux支持的nice级别从19(最低优先级)到-20(最高优先级),默认为0。只有root身份的用户才能把进程的nice级别调整为负数(让其具备较高优先级)。
4、进程的状态
每个进程都有自己的状态,显示进程中当前发生的事情,进程执行时进程状态发生改变。可能的状态列表如下:
运行状态:
在这个状态中,进程正在CPU中执行,或者在运行队列(run queue)中等待运行。
停止状态:
进程由于特定的信号(如SIGINT、SIGSTOP)而挂起就会处于这个状态,等待恢复信号,比如SINCONT。
可中断的等待状态:
这类进程处于阻塞状态,一旦达到某种条件,就会变为运行态。同时该状态的进程也会由于接收到信号而被提前唤醒进入到运行态。。
不中断的等待状态:
与“可中断的等待状态”含义基本类似,唯一不同的是处于这个状态的进程对信号不做响应。不中断的等待状态最典型的例子是进程等待磁盘I/O操作。
僵死状态:
也就是僵死进程,每个进程在结束后都会处于僵死状态,等待父进程调用进而释放资源,处于该状态的进程已经结束,但是它的父进程还没有释放其系统资源。
一个僵尸进程产生的过程是:父进程调用fork创建子进程后,子进程运行直至其终止,它立即从内存中移除,但进程描述符仍然保留在内存中(进程描述符占有极少的内存空间)。子进程的状态变成EXIT_ZOMBIE,并且向父进程发送SIGCHLD信号,父进程此时应该调用wait()系统调用来获取子进程的退出状态以及其它的信息。在 wait调用之后,僵尸进程就完全从内存中移除了。因此一个僵尸进程存在于其终止到父进程调用wait函数这个时间之间,一般很快就消失,但如果编程不合理,父进程从不调用wait等系统调用来收集僵尸进程,那么这些进程会一直存在内存中。最后形成一直滞留的僵尸进程。
二、Linux内存性能指标
在进程执行过程中,Linux内核会根据需要给进程分配一块内存区域。进程就把这片区域作为工作区,按要求执行操作。这就像给你分配一张自己的桌子,你可以在桌子上摆放文档,备忘录,然后展开自己的工作。区别在于,内核会以更加动态的方式分配空间。因为系统上运行的进程经常是成千上万的,但是内存却是有限的。因此,Linux必须高效的处理内存问题。这就涉及到了Linux下的内存高效管理机制。
1、物理内存和虚拟内存
物理内存就是系统硬件提供的内存大小,是真正的内存,在linux下还有一个逻辑内存的概念,逻辑内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存区域,用作逻辑内存的磁盘空间被称为交换空间(Swap Space)。
但是,在Linux操作系统中,无论是系统内核,还是应用程序,并不能直接使用物理内存和逻辑内存,要使用这些内存,需要通过一个映射机制实现,也就是说Linux操作系统会把所有内存(包含物理内存和逻辑内存)都映射成虚拟内存,这样,应用程序在使用内存时,需要向Linux内核请求一个特定大小的内存映射,并且收到一个虚拟内存的映射。这个申请到的虚拟内存不一定全部是物理内存的映射,还可能包含由磁盘上的swap空间映射来的内存。
Linux的这种虚拟内存管理机制对用户和应用程序通常都是不可见的。所以,如果我们要掌握Linux内存调优的办法,就必须先理解Linux内存架构、地址布局、以及Linux如何高效管理内存空间。
2、页高速缓存和页写回机制
页是物理内存或虚拟内存中一组连续的线性地址,Linux内核以页为单位处理内存,页的大小通常是4KB。当一个进程请求一定量的页面时,如果有可用的页面,内核会直接把这些页面分配给这个进程,否则,内核会从其它进程或者页缓存中拿来一部分给这个进程用。内核知道有多少页可用,也知道它们的位置。
如果在进程请求指定数量的内存页时没有可用的内存页,内核就会尝试释放特定的内存页给新的请求使用。这个过程叫做内存回收。其中,kswapd内核线程负责页面回收。
kswapd是虚拟内存管理中负责换页的,操作系统每过一定时间就会唤醒kswapd ,它基于最近最少使用原则(LRU,Least Recently Used)在活动页中寻找可回收的页面,看看内存是否紧张,如果不紧张,则睡眠,在kswapd中,有2个阀值,pages_hige和 pages_low,当空闲内存页的数量低于pages_low的时候,kswapd进程就会扫描内存并且每次释放出32个free pages,直到free page的数量到达pages_high。
Linux在负载比较大(内存很紧张)的时候一般会看到这样的两个进程kswapd0和kswapd1,如果这个进程占用系统资源很多,尤其是在负载很大的业务系统中,可能引起系统的宕机,如果这个进程占用资源非常高,那就要考虑优化系统,或添加硬件资源。
在某些情况下,kswapd进程如果频繁被唤醒的话,就会过度消耗CPU,此时可以通过设置大页内存(HugePages)来解决。这个具体实现方法将在后面详细介绍。
3、swap交换空间
linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到swap交换空间中,而将经常使用的信息保留到物理内存。
要深入了解linux内存运行机制,需要知道下面提到的几个方面:
首先,Linux系统会不时的进行页面交换操作,以保持尽可能多的空闲物理内存,即使并没有什么事情需要内存,Linux也会交换出暂时不用的内存页面。这可以避免等待交换所需的时间。
其次,linux进行页面交换是有条件的,不是所有页面在不用时都交换到swap,linux内核根据”最近最经常使用“算法,仅仅将一些不经常使用的页面文件交换到swap,有时我们会看到这么一个现象:linux物理内存还有很多,但是swap也使用了很多。其实,这并不奇怪,例如,一个占用很大内存的进程运行时,需要耗费很多内存资源,此时就会有一些不常用页面文件被交换到swap中,但后来这个占用很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页面文件并不会自动的交换进物理内存,除非有这个必要,那么此刻系统物理内存就会空闲很多,同时交换空间也在被使用,就出现了刚才所说的现象了。关于这点,不用担心什么,只要知道是怎么一回事就可以了。
最后,swap的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页面,它们又会被马上交换出去,如此以来,虚拟内存中可能没有足够空间来存储这些交换页面,最终会导致linux出现假死机、服务异常等问题,linux虽然可以在一段时间内自行恢复,但是恢复后的系统已经基本不可用了。
由此可知,合理规划swap非常重要。
三、文件系统性能指标
Linux作为开源操作系统,最大的优势是它可以支持各类文件系统,了解linux下各个文件系统的功能特性,有助于我们在优化性能的时候,根据使用需求来选择适合自己的文件系统。
1、linux下ext3/ext4/xfs文件系统的特性
linux标准文件系统是从VFS开始的,然后是ext,接着就是ext2,应该说ext2是linux上标准的文件系统,ext3是在ext2基础上增加日志形成的,从VFS到ext3,其设计思想没有太大变化,都是早期UNIX家族基于超级块和inode的设计理念。
ext2文件系统一般有超级块、块组描述符、块组组成,它使用索引节点(inode)来记录文件信息,一个inode对应一个文件,索引节点是一种数据结构,它存放着文件的重要属性信息,如文件大小、访问时间、修改时间、创建时间、访问权限、文件属主ID、组ID、块数等等。
为了避免磁盘大量访问出现的性能问题,一般的文件系统都采用异步方式工作,也就是读和写操作不是同步进行的,例如我们修改了某个文件,这个修改操作仅仅存在于内存中,对这个文件的修改并不会马上写入磁盘,但是系统会通过一个守护进程,在一个合理的时间段内,批量的将修改操作写入磁盘。通过这种机制优化了文件系统的写入性能。
ext2文件系统保存有冗余的关键元数据信息的备份,因此一般来说不会出现数据完全丢失的情况,在系统重新启动时,ext2文件系统会调用文件扫描工具fsck试图恢复损坏的元数据信息,这种扫描是对整个文件系统进行扫描,很明显,要扫描的文件系统分区越大,检测过程就越长,很显然,这种机制无法应用到对实时性要求很高的业务系统上,此时ext3文件系统产生了。
ext3是一种日志式文件系统,其实就是在ext2文件系统基础上增加一个特殊的inode(日志文件)即日志记录功能,用于记录文件系统元数据或者各种写操作的变化,这样以来,在磁盘操作事务被真正写入到磁盘最终位置以前,首先通过日志文件的记录功能,顺序的记录了文件系统的各种写操作和元数据的变化。
因此,在ext3文件系统下,如果系统崩溃在日志内容被写入之前发生,那么原始数据仍然保留在磁盘上,丢失的仅仅是最新的更新内容。
如果当崩溃发生在真正的写操作时(此时日志文件记录已经更新),由于日志文件系统的内容完整的记录着进行了哪些操作。因此当系统重启时,日志文件系统就能根据日志内容,很快地恢复被破坏的数据或者文件系统。
ext3文件系统流行了10多年,最终又被ext4文件系统取代,取代的原因是ext4功能更加先进,通过使用ext4文件系统,可以大大提高Linux系统的性能。例如ext4支持更多子目录数量、支持更大的文件系统和更大的文件、支持日志校验、支持快速fsck、支持在线碎片整理等等。
基于RHEL6.x/Centos6.x系统将ext4作为了默认的文件系统,而RHEL7.x/Centos7.x最新系统将xfs设为了默认的文件系统,xfs也是一个高级日志文件系统,最初用于unix系统中,后来被移植到linux,它通过分布处理磁盘请求、定位数据、保持cache 的一致性来提供对文件系统数据的低延迟、高带宽的访问,因而,XFS极具伸缩性,非常健壮。
目前主流的文件系统是ext4和xfs,可根据具体的应用环境,选择最合适的一个文件系统。
2、文件系统的选择和优化
面对这么多的文件系统,用户应该如何选择呢,一个合理的选择标准是:将应用的特点和环境与文件系统特性结合起来综合考虑,任何脱离应用环境而单独谈文件系统优劣的方法都是不合理和不科学的。
下面我们针对不同的应用环境,介绍一下如何选择合理的文件系统。
读操作频繁,同时小文件众多的应用
对于此类应用,选择ext4文件系统都是不错的选择。
写操作频繁的应用
如果是一些大数据文件操作,同时,应用本身需要大量日志写操作,那么,xfs文件系统是最佳选择,根据实际应用经验,对xfs、ext4、ext3块写入性能对比,整体上性能差不多,但在效率上(CPU利用率)最好的是xfs,接下来依次是ext4和ext3。
对性能要求不高、数据安全要求不高的业务
对于这类应用,ext3/ext2文件系统是比较好的选择,因为ext2没有日志记录功能,这样就节省了很多磁盘性能。例如linux系统下的/tmp分区就可以采用ext2文件系统。
3、消除文件系统瓶颈的方法
如果我们要对文件系统进行调优,需要重点关注哪些方面呢,这里做个简单的总结。
(1)、如果程序访问磁盘的方式是顺序访问,那么就换一个更好的磁盘控制器。如果是随机访问的,那么就增加更多的磁盘控制器
(2)、磁盘存储一定要使用RAID技术。根据不同的使用需求,选择不同的RAID级别,例如写频繁,数据安全性要求一般,可采用RAID0,如果对数据安全性要求很高,可采用RAID1或RAID10,RAID有软、硬RAID,优先使用基于硬件实现的RAID。
(3)、给磁盘合理分区,合理的磁盘分区,也有助于提供文件系统性能,例如将写频繁的应用放到不同的磁盘中,这样可以最大限度的提高写入性能。
(4)、选择合适的文件系统,根据上面介绍,结合业务特点,选择一个适合的文件系统是非常有必要的。
四、磁盘I/O性能指标
磁盘数据的读、写一直是影响系统性能的重要部分,下面重点介绍一下磁盘的读、写机制以及影响磁盘IO的性能指标。
1、 磁盘I/O调度策略
IO调度器的总体目标是希望让磁头能够总是往一个方向移动,移动到底了再往反方向走,这恰恰就是现实生活中的电梯模型,所以IO调度器也被叫做电梯(elevator),而相应的算法也就被叫做电梯算法。
Linux中IO调度的电梯算法有好几种,一个叫做 cfq(Complete Fairness Queueing),一个叫做deadline,还有一个叫做noop(No Operation),具体使用哪种算法我们可以在启动的时候通过内核参数elevator来指定。
完全公平排队(CFQ,Complete Fair Queuing)
顾名思义,绝对公平算法。CFQ为每个进程/线程,单独创建一个队列来管理该进程所产生的请求,也就是说每个进程一个队列,各队列之间的调度使用时间片来调度,以此来保证每个进程都能被很好的分配到I/O带宽。在Linux2.6内核上,默认采用的就是CFQ的I/O调度器。 期限(Deadline)
Deadline算法的核心在于保证每个IO请求在一定的时间内一定要被服务到,以此来避免某个请求饥饿。在Linux3.x以后内核上,默认采用的就是Deadline的I/O调度器。根据经验,在服务器环境下推荐使用Deadline调度器能够获得更好的性能。 NOOP
NOOP表示没有操作(No Operation),Noop调度算法是内核中最简单的IO调度算法。Noop调度算法也叫作电梯调度算法,它将IO请求放入到一个FIFO队列中,然后逐个执行这些IO请求,当然对于一些在磁盘上连续的IO请求,Noop算法会适当做一些合并。这个调度算法特别适合那些不希望调度器重新组织IO请求顺序的应用。例如对于SSD磁盘,采用Noop调度算法效果会更好一些。
2、磁盘与缓存机制
硬件发展到现在,处理器的性能得到了飞速的提升,但是RAM和磁盘并没有质的飞跃,这导致了系统整体性能并没有因为处理器速度的提升而提升,那么如何解决CPU处理速度快,而磁盘存取速度慢的问题呢,这就用到了缓存技术,通过把常用数据放入到更快速度的内存中,通过缓存机制解决了处理器和磁盘之间速度的不平衡。现代计算机系统在几乎所有的I/O组件中都使用了这项技术,例如硬盘缓存、磁盘控制器缓存以及文件系统缓存。
由于CPU寄存器和磁盘之间的访问速度差异很大,CPU会花很多时间等待磁盘中的数据,这导致CPU的高性能无用武之地,所以要通过缓存机制来解决,缓存技术通过L1 cache、L2 cache、RAM等多级缓存来消除CPU和磁盘之间的存储速度差异。
Linux通过独立的磁盘缓存机制:页高速缓存来解决CPU和磁盘的这种读取差异,它的机制如下:
在进程从磁盘中读数据时,数据被复制到内存中。该进程和其它进程都可以在内存缓存中读取同样的数据副本。当进程尝试改变数据时,进程首先修改内存中的数据,这时候,磁盘和内存中的数据就不一致了,内存中的数据就叫做脏缓冲(dirty buffer)。脏缓冲应该尽快同步到磁盘上,否则,如果突然崩溃,内存中的数据就会丢失。
同步脏缓冲是由内核中的一个线程(flusher 线程)来完成的,此线程用于将内存中脏缓冲同步到磁盘文件系统上,触发脏缓冲被写回磁盘有3种情况,分别是:
当空闲内存低于一个特定的阈值时,空闲内存不足时,需要释放一部分缓存,由于只有非脏页面才能被释放,所以要把脏页面都回写到磁盘,使其变成干净的页面。
当脏页在内存中驻留时间超过特定阈值时,这种机制确保了脏页面不会无限期的驻留在内存中,从而减少了数据丢失的风险。
当用户进程调用sync()和fsync()系统调用时,这是给用户提供一种强制回写的方法,应对回写要求严格的场景。
flusher线程的实现方法随着内核的发展也在不断的变化着,在Linux2.6版本前flusher线程的实现方法是通过一个bdflush线程来实现的,当内存消耗到特定阀值以下时,bdflush 线程被唤醒,kupdated周期性的运行,写回脏页。但是bdflush存在如下问题:
整个系统仅仅只有一个bdflush线程,当系统回写任务较重时,bdflush线程可能会阻塞在某个磁盘的I/O上,导致其他磁盘的I/O回写操作不能及时执行。
基于此问题,在Linux2.6版本中,引入了pdflush线程,pdflush数目是动态的,数量取决于系统的I/O负载。它是面向系统中所有磁盘的全局任务。但是pdflush线程也存在下面问题:
pdflush的数目是动态的,一定程度上缓解了bdflush的问题。但是由于pdflush是面向所有磁盘的,所以有可能出现多个pdflush线程全部阻塞在某个拥塞的磁盘上,同样导致其他磁盘的I/O回写不能及时执行。
基于上面的问题,在Linux2.6.32版本后,又引入了全新的flusher线程概念,flusher线程的数目不是唯一的,这就避免了bdflush线程的问题,同时,flusher线程不是面向所有磁盘的,而是每个flusher线程对应一个磁盘,这就避免了pdflush线程的问题。
页回写中涉及的一些阀值可以在/proc/sys/vm中找到,需要关注的几个指标如下:
dirty_background_ratio:表示当脏页所占的百分比(相对于所有可用内存,即空闲内存页+可回收内存页)达到dirty_background_ratio时,write调用会唤醒内核的flusher线程开始回写脏页数据,直到脏页比例低于此值。
dirty_background_bytes:当脏页所占的内存数量超过dirty_background_bytes时,内核的flusher线程开始回写脏页。
dirty_expire_interval: 该数值以百分之一秒为单位,它描述超时多久的数据将被周期性执行的pdflush线程写出。
dirty_ratio: 脏页所占的百分比(相对于所有可用内存,即空闲内存页+可回收内存页)达到dirty_ratio时,write调用会唤醒内核的flusher线程开始回写脏页数据,直到脏页比例低于此值,注意write调用此时会阻塞。
dirty_writeback_centisecs: 设置flusher内核线程唤醒的间隔,此线程用于将脏页回写到磁盘,单位是百分之一秒。
dirty_expire_centisecs:脏数据的过期时间,超过该时间后内核的flusher线程被唤醒时会将脏数据回写到磁盘上,单位是百分之一秒。
五、网络调优指标
网络调优也行Linux调优必须要考虑的一个因素,网络调优涉及很多组件,例如交换机、路由器、网关、防火墙等等。尽管这些组件不受到Linux系统的控制,但是,它们对系统的整体性能有很大影响。因此,调优过程必须要和维护网络系统的人员紧密联系。
在实际的网络调优中,需要重点关注的有如下性能指标:
1、网络拓扑结构是否合理,例如是否有冗余,吞吐量是否足够。
网络中接入交换机、核心交换机背板带宽是否足够,网络结构是否有冗余,以确保网络设备故障的时候可以不影响网络运行。同时,网络配置是否正确,配置参数是否合理,是否能发挥最大的网络性能。
2、服务器硬件要根据应用需求使用更快的网卡,例如千兆网卡、万兆光纤。
使用速度更快,更稳定的网卡可以最大限度保障网络性能,例如可采用千兆光纤、万兆光纤接口,并通过多网卡绑定实现冗余功能,可最大程度保障网络稳定性和可靠性。
3、在操作系统内核中调整关于网络的参数,以确保网络性能达到最优。
Linux系统中关于网络的内核参数有很多,例如设置接收和发送缓冲区的大小、设置传输窗口、设置网络等待时间等参数,确保网络在操作系统下以最优性能运行,这部分内容在后面会详细进行介绍。
标签:文件系统,获取,调优,线程,内存,Linux,进程,磁盘 From: https://blog.51cto.com/ixdba/8504576