系统调优

author author     2022-09-04     495

关键词:

  前面说到过select/poll/epoll这三个系统调用,我们都知道,Unix/Linux下把所有的设备都当成文件来进行I/O,所以,那三个操作更应该算是I/O相关的系统调用。说到I/O模型,这对于我们的I/O性能相当重要,我们知道,Unix/Linux经典的I/O方式是(关于Linux下的I/O模型,大家可以读一下这篇文章《使用异步I/O大大提高性能》):

第一种,同步阻塞式I/O,这个不说了。

第二种,同步无阻塞方式。其通过fctnl设置O_NONBLOCK来完成。

第三种,对于select/poll/epoll这三个是I/O不阻塞,但是在事件上阻塞,算是:I/O异步,事件同步的调用。

第四种,AIO方式。这种I/O模型是一种处理与I/O并行的模型。I/O请求会立即返回,说明请求已经成功发起了。在后台完成I/O操作时,向应用程序发起通知,通知有两种方式:一种是产生一个信号,另一种是执行一个基于线程的回调函数来完成这次I/O处理过程。

第四种因为没有任何的阻塞,无论是I/O上,还是事件通知上,所以,其可以让你充分地利用CPU,比起第二种同步无阻塞好处就是,第二种要你一遍一遍地去轮询。Nginx之所所以高效,是其使用了epoll和AIO的方式来进行I/O的。

再说一下Windows下的I/O模型:

a)一个是WriteFile系统调用,这个系统调用可以是同步阻塞的,也可以是同步无阻塞的,关于看文件是不是以Overlapped打开的。关于同步无阻塞,需要设置其最后一个参数Overlapped,微软叫Overlapped I/O,你需要WaitForSingleObject才能知道有没有写完成。这个系统调用的性能可想而知。

b)另一个叫WriteFileEx的系统调用,其可以实现异步I/O,并可以让你传入一个callback函数,等I/O结束后回调之,但是这个回调的过程Windows是把callback函数放到了APC(Asynchronous Procedure Calls)的队列中,然后,只用当应用程序当前线程成为可被通知状态(Alterable)时,才会被回调。只有当你的线程使用了这几个函数时WaitForSingleObjectExWaitForMultipleObjectsEx, MsgWaitForMultipleObjectsExSignalObjectAndWait SleepEx,线程才会成为Alterable状态。可见,这个模型,还是有wait,所以性能也不高。

c)然后是IOCP–IO Completion Port,IOCP会把I/O的结果放在一个队列中,但是,侦听这个队列的不是主线程,而是专门来干这个事的一个或多个线程去干(老的平台要你自己创建线程,新的平台是你可以创建一个线程池)。IOCP是一个线程池模型。这个和Linux下的AIO模型比较相似,但是实现方式和使用方式完全不一样。

当然,真正提高I/O性能方式是把和外设的I/O的次数降到最低,最好没有,所以,对于读来说,内存cache通常可以从质上提升性能,因为内存比外设快太多了。对于写来说,cache住要写的数据,少写几次,但是cache带来的问题就是实时性的问题,也就是latency会变大,我们需要在写的次数上和相应上做权衡。

B)多核CPU调优

关于CPU的多核技术,我们知道,CPU0是很关键的,如果0号CPU被用得过狠的话,别的CPU性能也会下降,因为CPU0是有调整功能的,所以,我们不能任由操作系统负载均衡,因为我们自己更了解自己的程序,所以,我们可以手动地为其分配CPU核,而不会过多地占用CPU0,或是让我们关键进程和一堆别的进程挤在一起。

  • 对于Windows来说,我们可以通过“任务管理器”中的“进程”而中右键菜单中的“设置相关性……”(Set Affinity…)来设置并限制这个进程能被运行在哪些核上。
  • 对于Linux来说,可以使用taskset命令来设置(你可以通过安装schedutils来安装这个命令:apt-get install schedutils)

多核CPU还有一个技术叫NUMA技术(Non-Uniform Memory Access)。传统的多核运算是使用SMP(Symmetric Multi-Processor )模式,多个处理器共享一个集中的存储器和I/O总线。于是就会出现一致存储器访问的问题,一致性通常意味着性能问题。NUMA模式下,处理器被划分成多个node,每个node有自己的本地存储器空间。关于NUMA的一些技术细节,你可以查看一下这篇文章《Linux的NUMA技术》,在Linux下,对NUMA调优的命令是:numactl 。如下面的命令:(指定命令“myprogram arg1 arg2”运行在node 0上,其内存分配在node 0 和1上)

numactl --cpubind=0 --membind=0,1 myprogram arg1 arg2 

当然,上面这个命令并不好,因为内存跨越了两个node,这非常不好。最好的方式是只让程序访问和自己运行一样的node,如:

numactl --membind 1 --cpunodebind 1 --localalloc myapplication 

C)文件系统调优

关于文件系统,因为文件系统也是有cache的,所以,为了让文件系统有最大的性能。首要的事情就是分配足够大的内存,这个非常关键,在Linux下可以使用free命令来查看 free/used/buffers/cached,理想来说,buffers和cached应该有40%左右。然后是一个快速的硬盘控制器,SCSI会好很多。最快的是Intel SSD固态硬盘,速度超快,但是写次数有限。

接下来,我们就可以调优文件系统配置了,对于Linux的Ext3/4来说,几乎在所有情况下都有所帮助的一个参数是关闭文件系统访问时间,在/etc/fstab下看看你的文件系统有没有noatime参数(一般来说应该有),还有一个是dealloc,它可以让系统在最后时刻决定写入文件发生时使用哪个块,可优化这个写入程序。还要注间一下三种日志模式:data=journal、data=ordered和data=writeback。默认设置data=ordered提供性能和防护之间的最佳平衡。

当然,对于这些来说,ext4的默认设置基本上是最佳优化了。

这里介绍一个Linux下的查看I/O的命令——iotop,可以让你看到各进程的磁盘读写的负载情况。

其它还有一些关于NFS、XFS的调优,大家可以上google搜索一些相关优化的文章看看。关于各文件系统,大家可以看一下这篇文章——《Linux日志文件系统及性能分析》。

 

优化技术专题「系统性能调优实战」终极关注应用系统性能调优及原理剖析(下册)

前提介绍承接上文:【优化技术专题】「系统性能调优实战」终极关注应用系统性能调优及原理剖析(上册)之后我们接下来进行相关的。流程相关分析优化通过access_log.txt日志分析,在特定时间段内,将请求至系统的url分组计... 查看详情

系统调优的4大子系统

系统调优的4大子系统:1、查看系统中使用cpu最多的进程top->pps-aux--sort-pcpu|more2、找出系统中使用内存最多的进程top->mps-aux--sort-rss|more3、找到系统对磁盘读写最多的进程iostat和iotopiostat-d-k-p/dev/sdaiotop-o-d24、找到系统中使用网... 查看详情

性能调优方法论

...调优数据库管理员应用架构师应用设计师应用开发人员OS系统管理员存储系统管理员二、DBA在调优中做什么1)应用调优(DBA和开发人员合作)SQLstatementperformanceChangemanagement2)实例调优(DBA负责)MemoryDatabasestructureInstanceconfiguration... 查看详情

jvm性能调优

...比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等。架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的。性能调优基本上按照以下步骤进行:明确优化目标、发现性能瓶颈、性能调优、通... 查看详情

linux系统层面调优和常见的面试题

...群,还是Hadoop集群等大数据相关的集群进行调优,对linux系统层面的调优都是必不可少的,这里主要介绍3种常用的调优:1.linux文件句柄linux在整个系统层面和单个进程两个层面对打开的文件句柄进行限制。配置文件/proc/sys/fs/file-... 查看详情

linux系统性能与调优(未完)

目录一、基本概念二、系统调优的目的三、CPU工作原理一、基本概念QPS:querypersecond,1秒内完成的请求数RT:responsetime,1个请求完成的时间Throughput越大,Latency会越差。因为请求量过大,系统太繁忙,所以响应速度自然会低Latency越... 查看详情

day818.电商系统的分布式事务调优-java性能调优实战(代码片段)

电商系统的分布式事务调优Hi,我是阿昌,今天学习记录的是关于电商系统的分布式事务调优。一个线上事故,在一次DBA完成单台数据库线上补丁后,系统偶尔会出现异常报警,开发工程师很快就定位到了数据... 查看详情

day818.电商系统的分布式事务调优-java性能调优实战(代码片段)

电商系统的分布式事务调优Hi,我是阿昌,今天学习记录的是关于电商系统的分布式事务调优。一个线上事故,在一次DBA完成单台数据库线上补丁后,系统偶尔会出现异常报警,开发工程师很快就定位到了数据... 查看详情

kafka调优(代码片段)

...JVM层:KafkaBroker进程是普通的JVM进程,对JVM的优化操作系统层:对操作系统层的优化基础性调优挂载(Mount)文件系统时,禁掉atime更新(accesstime,文件最后被访问的时间)记录atime要操作系统访问inode资源禁掉atime能避免inode访问时... 查看详情

jvm原理及性能调优系列(jvm调优)

...老生代的最大和值)和最小堆内存(jvm启动时占用的操作系统内存大小),及设置好堆的比例分配。2、设置合适的新生代因为对其对系统性能和GC回收有一定的影响。3、设置合适的持久代因为其直接决定系统可以支持多少个类... 查看详情

系统调优

 前面说到过select/poll/epoll这三个系统调用,我们都知道,Unix/Linux下把所有的设备都当成文件来进行I/O,所以,那三个操作更应该算是I/O相关的系统调用。说到I/O模型,这对于我们的I/O性能相当重要,我们知道,Unix/Linux经典... 查看详情

linux操作系统状态查看及调优

...IO运行状态相关工具 查看Network运行状态相关工具 查看系统整体运行状态系统调优思路性能优化就是找到系统处理中的瓶颈以及去除这些的过程,性能优化其实是对OS各子系统达到一种平衡的定义。具体步骤如下:系统... 查看详情

linux性能调优总结(代码片段)

系统性能一直是个热门话题。做运维这几年也一直在搞性能调优,写这个文章也算是对工作的总结。讲调优第一步是,要讲为什么要调优?也就是系统分析,分析还需要有指标,做好性能监控的情况下,看到确实需要调优才能进... 查看详情

jvm调优

堆大小设置JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在WindowsServer2003系... 查看详情

jvm调优

堆大小设置JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在WindowsServer2003系... 查看详情

jvm调优经验参数设置

...小设置    JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。在WindowsServer2003... 查看详情

系统稳定性-调优3.4常见binder相关异常调优总结

binder通信是Android特有的一种通信机制,常见binder相关的异常包括卡binder对端处理超时,binder本端处理超时(导致主线程block)以及binder耗尽三类问题。无论是应用,Framework,Hal中间件,还是BSP驱动,熟悉这三类binder相关case的调... 查看详情

freevmstat查看内存及系统调优

内存查看查看内存是否存在瓶颈,使用top指令看比较麻烦,而free命令更为直观:[/home/weber#]freetotalusedfreesharedbufferscachedMem:50182045202849792370645056136732-/+buffers/cache:310240191580Swap:000[/home/weber#]toptop-17:52:17up42days 查看详情