seo常用优化技巧 网站代码优化工具( 七 )


常识和数据
CPU拷贝数据一般一秒钟能做到几百兆,当然每次拷贝的数据长度不同,吞吐不同 。
一次函数执行如果耗费超过1000 cycles就比较大了(刨除调用子函数的开销) 。
pthread_mutex_t是futex实现,不用每次都进入内核,首次加解锁大概耗时4000-5000 cycles左右,之后,每次加解锁大概120 cycles,O2优化的时候100 cycles,spinlock耗时略少 。
lock内存总线+xchg需要50 cycles,一次内存屏障要50 cycles 。
有一些无锁的技术,比如CAS,比如linux kernel里的kfifo,主要利用了整型回绕+内存屏障 。
几个如何?
1. 如何定位CPU瓶颈?
CPU是通常大家最先关注的性能指标,宏观维度有核的CPU使用率,微观有函数的CPU cycle数,根据性能的模型,性能规格与CPU使用率是互相关联的,规格越高,CPU使用率越高,但是处理器的性能往往又受到内存带宽、Cache、发热等因素的影响,所以CPU使用率和规格参数之间并不是简单的线性关系,所以性能规格翻倍并不能简单地翻译成我们的CPU使用率要优化一倍 。
至于CPU瓶颈的定位工具,最有名也是最有用的工具就是perf,它是性能分析的第一步,可以帮我们找到系统的热点函数 。就像人看病一样,只知道症状是不够的,需要通过医疗机器进一步分析病因,才能对症下药 。
所以我们通过性能分析工具PMU或者其他工具去进一步分析CPU热点的原因比如是指令数本身就比较多,还是Cache miss导致的等,这样在做性能优化的时候不会走偏 。
优化CPU的目标就是让CPU运行不受阻碍 。
2. 如何定位IO瓶颈?
系统IO的瓶颈可以通过CPU和负载的非线性关系体现出来 。当负载增大时,系统吞吐量不能有效增大,CPU不能线性增长,其中一种可能是IO出现阻塞 。
系统的队列长度特别是发送、写磁盘线程的队列长度也是IO瓶颈的一个间接指标 。
对于网络系统来讲,我建议先从外部观察系统 。所谓外部观察是指通过观察外部的网络报文交换,可以用tcpdump, wireshark等工具,抓包看一下 。
比如我们优化一个RPC项目,它的吞吐量是10TPS,客户希望是100TPS 。我们使用wireshark抓取TCP报文流,可以分析报文之间的时间戳,响应延迟等指标来判断是否是由网络引起来的 。
然后可以通过netstat -i/-s选项查看网络错误、重传等统计信息 。还可以通过iostat查看cpu等待IO的比例 。IO的概念也可以扩展到进程间通信 。
对于磁盘类的应用程序,我们最希望看到写磁盘有没有时延、频率如何 。其中一个方法就是通过内核ftrace、perf-event事件来动态观测系统 。比如记录写块设备的起始和返回时间,这样我们就可以知道磁盘写是否有延时,也可以统计写磁盘时间耗费分布 。有一个开源的工具包perf-tools里面包含着iolatency, iosnoop等工具 。
3. 如何定位IO瓶颈?
应用程序常用的IO有两种:Disk IO和网络IO 。判断系统是否存在IO瓶颈可以通过观测系统或进程的CPU的IO等待比例来进行,比如使用mpstat、top命令 。
系统的队列长度特别是发送、写磁盘线程的队列长度也是IO瓶颈的一个重要指标 。
对于网络 IO来讲,我们可以先使用netstat -i/-s查看网络错误、重传等统计信息,然后使用sar -n DEV 1和sar -n TCP,ETCP 1查看网路实时的统计信息 。ss (Socket Statistics)工具可以提供每个socket相关的队列、缓存等详细信息 。
更直接的方法可以用tcpdump, wireshark等工具,抓包看一下 。
对于Disk IO,我们可以通过iostat -x -p xxx来查看具体设备使用率和读写平均等待时间 。如果使用率接近100%,或者等待时间过长,都说明Disk IO出现饱和 。


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: