第2讲TS101内核
- 格式:ppt
- 大小:624.00 KB
- 文档页数:110
Linux 设备驱动 Edition 3ByJonathan Corbet,Alessandro Rubini,Greg Kroah-Hartman由 quickwhale 翻译的简体中文版 V0.1.0 2006-6-2学习编程有几年了,感觉走了不少弯路,而不少的学弟学妹又在重蹈我当初的覆辙,不免有些痛心。
最近在网上也看了许多前辈们的经验建议,再结合自己的学习经历在这里谈谈基础的重要性,希望帮助大家少走些弯路。
什么是基础呢?就是要把我们大学所学的离散数学,算法与数据结构,操作系统,计算机体系结构,编译原理等课程学好,对计算机的体系,CPU本身,操作系统内核,系统平台,面向对象编程,程序的性能等要有深层次的掌握。
初学者可能体会不到这些基础的重要性,学习jsp,donet,mfc,vb的朋友甚至会对这些嗤之以鼻,但是一开始没学好基础就去学jsp或donet会产生很坏的影响,而且陷入其中不能自拔。
我上大二的时候还对编程没什么概念,就上了门C++也不知道能干什么,老师说MFC也不知道是什么东西,看别的同学在学就跟着学了,然后就了解到.net,j2ee,php是什么了,就觉得软件开发就是用这些了,而上的那些专业课又与我们学的sqlserver啊,css啊,ajax啊,毫无关系,就感慨啊,还不如回家自学去就为一个文凭吗?还不如去培训,浪费这么多钱.于是天天基本上没去上什么课,天天就在做网站,几个学期就做了三个网站。
感觉做这些网站就是学到些技巧,没什么进步,这些技巧就好比别人的名字,告诉你你就知道了,网上也都可以搜到。
那时候就觉得把.net学好就行了,搞j2ee的比较难,搞api编程就别想了,操作系统更是望尘莫及了。
后来随着学习的深入和看了网上许多前辈们的建议才对这些基础的重要性有所体会。
虽然.net或java的开发并不直接用到汇编,操作系统这些,但是不掌握这些基础是有很大问题的,因为你只知其然不知其所有然,在mfc和.net里面控件一拖什么都做好了,很方便,但是出了问题可能就解决不了,有些在网上搜都搜不到。
Java常见问题排查java问题的排查这么多年⼏乎没有什么改进,还是⽼的⽅法;每年查的问题也都很类似,不会有什么太多特殊的问题出现;java⼀些很常见的问题基本可以⽤⼀个模式去解的(⼤部分问题,只是有些问题⽐较复杂)所有的性能优化问题跟排查⼀个故障没有太⼤区别,因为最终都体现在⼀些系统指标上;查java问题要先知道系统的指标,因为所有的异常通常来讲系统指标都会有体现;⼀、排查java问题要先知道的1.系统指标查看1.1 top可以查看实时的每个核的状况1.2 tsvmstat好处是可以查看分钟级,不管是cpu、内存、⽹卡,可以查历史的每⼀分钟的各项指标,对历史问题⾮常有帮助,只是不能看每个核的运⾏状况;这两个是最重要的,所有的性能优化体现在系统上基本上都会体现在某个指标上;如果业务代码还可以,则会把某个硬件指标跑满,如果业务代码有问题,则硬件所有指标都没跑满,应⽤挂了。
2.要关注2.1 cpu2.1.1 us⼤多是应⽤本⾝的消耗java应⽤压⼒越⼤,我们追求的通常是us越⾼越好,这样说明主要消耗都在业务上,才说明业务代码写得还不错;2.1.2 sy 上下⽂切换和内核的消耗java应⽤的cpu的sy不应该太⾼,因为java应⽤主要是线程上下⽂的切换,内核层⾯会有⼀点消耗,但通常不多,如果sy很⾼的话,通常是因为⾼并发程序⼏个线程抢锁抢得⾮常厉害;2.1.3 iowait 磁盘除⾮是⽤java做存储相关,做业务层⾯⼀般不会碰到io问题;2.1.4 si 软中断,通常是⽹卡中断处理通常可以把si压到瓶颈是⽹卡的中断处理,就是⽹卡中断处理不过来,⽬前认为这种在硬件情况下⽆法突破,已经说明你的软件写得⾮常好;2.2 ⽹卡带宽cpu⼏乎可以展现所有的硬件状况,除了⽹卡带宽,⽤专⽤⼯具(tsvmstat)查看,通常不会把⽹卡跑满,除⾮有拉数据。
所以不管是做性能优化还是查问题之前,⼀定要看系统指标;⼆、java常见问题NoSuchMethodException、OutOfMemoryError、CPU us⾼、应⽤没响应、java进程没了有可能本地没碰到NoSuchMethodException,但线上碰到了,这个挺正常的;⼏乎所有java开发⼈员都会碰到OOM,不管是性能优化还是故障排查,通常我们的应⽤最后都会变成围绕CPU us去解决问题;1.NoSuchMethodException1.1 出现这种现象的原因1.1.1 java ClassLoader机制跟类加载有很⼤关系,它不是⼀个很好的机制,它有很多的问题,⽐如说启动完它会分⼏个⽬录分别加载jar包,这样就碰到jar版本冲突问题;1.1.2 java⾥让⼈极度头疼的jar版本冲突问题⼯程引⽤了A和B,A和B⼜都引⽤了C,但引⽤C的版本不同(groupId相同),这种问题maven就能解决,java⾥碰到的通常不是这种,这种编译就搞定了;通常碰到的是很多开源的框架很讨厌,他们的做法是依赖⼀个jar包时,把jar包⾥所有的代码拷贝到⾃⼰的代码⾥,然后打成他们⾃⼰的包,这种情况maven就不可能知道了,这种情况⼏乎所有的开源框架都⼲,这个是java⾥⾯很难解决的问题,因为冲突的问题很正常,⽽且有些根本不是你造成的,⼀旦出现就很容易出现NoSuchMethodException,就是有可能你⽤了⼀个新版本的⽅法,由于它加载了⽼的可能就会找不到,这种情况可能导致⽣产环境发布时发布的环境⼀模⼀样,有⼏台正常,有⼏台却发布失败,是因为java在加载⼀个⽬录下所有jar包的顺序完全取决于OS,⽽linux系统完全取决于inode的顺序,⽽inode的顺序不完全能控制;这个问题太⿇烦了,没⼈去解,理论上正确的解决⽅法是java加载jar包时是带加载⾃⼰的顺序去加载;有时候碰到很诡异的问题都是可以被解释的,也很正常;1.2 同类型的问题ClassNotFoundException/NoClassDefFoundError/ClassCastException1.3 排查⽅法1.3.1 -XX:+TraceClassLoading会打印出类是从哪个jar包加载的,如果有问题的话,就是那个位置不是你想的那个位置,需要修改配置并重启;1.3.2 jar -tvf *.jar如果对应⽤的运⾏机制很清楚,应⽤通常来讲都是tomcat或者jboss,意味着jar包都会从tomcat⾃⼰的rive下或者应⽤的web-inf⽬录下加载,如果你很清楚,你可以解压所有的jar,tvf不会展开只是⼀个列表⽽已,打印出所有的类,查看是否有同样包名同样类名的东西在两个jar包⾥都有,如果他们两个md5 sum出来不⼀样,则说明这两个版本冲突,冲突说明环境⼀直存在风险,全部都存在风险;版本冲突不会死⼈,最多就是⼀点点问题;碰到问题会解就好,通常就直接⽤jar -tvf *.jar看哪个class冲突了;这个时候就可以写个脚本⾃动的查看有没有两个类冲突的问题; 23561.4 解决⽅法1.4.1 mvn pom⾥去除不需要的版本provided;开源⼲的坏事那种只能作⼀个bugfix版本,只能这样;1.4.2 在打包阶段就尽可能避免掉版本冲突问题类加载相关的所有问题在java⾥都不算太难解,虽然不⼤难查问题,但解决起来稍微会有点复杂,就看问题有多⿇烦;2. ng.OutOfMemoryErrorOOM还包括了不报OOM,但GC已经⽐较频繁了这种现象,⽐如说应⽤写得还可以的情况下,压⼒施加上去,瓶颈会出现在gc,gc会⾮常的频繁,但它不会报OOM,jvm源码⾥只有以下七种原因可导致OOM,这七种在java⾥⾯多数都是有解决⽅案的,java⼯具体系⽐很多其他语⾔要成熟:GC overhead limitexceeded、Java Heap Space、Unable to create new native thread、PermGen Space、Direct buffer memory、Map failed、request {} bytes for {}. Out of space?2.1 GC overhead limit exceeded/Java Heap Space最常见的OOM后⾯跟的原因描述通常会是这两种2.1.1出现这两种现象的原因:java heap分配不出需要的内存了java heap(-Xms -Xmx)包括eden/survivor/survivor/OldGen;NewGen(-Xmn,-XX:SurvivorRatio)包括Eden、Survivor0、Survivor1,PermGen(-XX:PermSize,-XX:MaxPermSize)⼀个jvm内存分为java heap和c heap,7(含)以前perm gen还是在java heap中,7以后就移到c heap中了,⼤家更多接触的是java heap.-Xms -Xmx不允许设置成⼀样的值,否则会平⽩⽆故增加⾮常多的GC,⽐如说内存到了⼀定⼤⼩,它觉得不⼤够⽤了,还不到最⼤值,这个时候它会gc,把内存放⼤,它觉得要缩⼩了,也会gc,⽤来缩⼩;2.1.2 排查⽅法(确定不是因为heap size⼤⼩的情况下)既然java heap满了,我们就要知道这个堆被谁⽤掉,如果知道被谁⽤掉,这个问题理论上就可以被解决了,如果要知道堆被谁⽤掉,⾸先要拿到heap dump⽂件,否则谁也⽆法解决问题;这⾥说是oom不是cpu load⾼的问题;a.拿到HeapDump⽂件a.1 -XX:+HeapDumpOnOutOfMemoryError这个启动参数只会在第⼀次OOM时产⽣dump⽂件(⽂件名以.hprof结尾),在target或者⼯作⽬录下,后⾯再报OOM,就不会⽣成了,它认为已经⽣成了,所以有可能第⼀次dump的⽂件没⽤,要后⾯的才⾏,也就是抓不到现场;如果登陆机器时正在OOM(有些应⽤⼀直在OOM),可执⾏jmap -dumpa.2 jmap -dump:file=<⽂件名>,format=b [pid]如果正在执⾏gc,可执⾏此命令,执⾏时会强制执⾏⼀次Full GC(正是由于这个原因,不要在线上随便执⾏这个命令,FullGC耗时很多,可能导致线上应⽤挂掉),但有可能有时dump不出来,碰到了也很正常,那就不⽤强⾏dump了,没什么意思,这时可尝试⼀下⽤gcorea.3 gcore [pid]⽣成c版core dump,再运⾏jmap -dump从core dump提取出java的heap dump,jmap -dump:format=b,file=heap.hprof java路径 core.dump⽂件,最好的做法是⽤gcore,⽽不是jmap -dump,gcore特别快,jmap特别慢,因为jmap -dump除了会引发FullGC也会⽣成⼀个与java heap 同⼤⼩的⽂件,java heap 有8g,⽣成的⽂件就有8g,java heap有100g时OOM就别查了,因为它会⽣成⼀个100g的⽂件,这是java排查问题⼀个致使的弱点,⽬前为⽌,业界也没有很好的解决⽅案;多数OOM的问题重启(绝对⼤招)是可以解决的,只是重启问题在于哪天⼜会出现。
mpu6050中文数据手册STM32F103CDE_DS_中文数据手册_V5导读:就爱阅读网友为您分享以下“STM32F103CDE_DS_中文数据手册_V5”的资讯,希望对您有所帮助,感谢您对92to 的支持!STM32F103xC, STM32F103xD, STM32F103xE数据手册55.1电气特性测试条件除非特别说明,所有电压的都以VSS为基准。
5.1.1 最小和最大数值除非特别说明,在生产线上通过对100%的产品在环境温度TA=25°C和TA=TAmax下执行的测试(TAmax与选定的温度范围匹配),所有最小和最大值将在最坏的环境温度、供电电压和时钟频率条件下得到保证。
在每个表格下方的注解中说明为通过综合评估、设计模拟和/或工艺特性得到的数据,不会在生产线上进行测试;在综合评估的基础上,最小和最大数值是通过样本测试后,取其平均值再加减三倍的标准分布(平均±3∑)得到。
5.1.2 典型数值除非特别说明,典型数据是基于TA=25°C和VDD=3.3V(2V ≤ VDD ≤ 3.3V电压范围)。
这些数据仅用于设计指导而未经测试。
典型的ADC精度数值是通过对一个标准的批次采样,在所有温度范围下测试得到,95%产品的误差小于等于给出的数值(平均±2∑)。
5.1.3 典型曲线除非特别说明,典型曲线仅用于设计指导而未经测试。
5.1.4 负载电容测量引脚参数时的负载条件示于图10中。
图10引脚的负载条件5.1.5 引脚输入电压引脚上输入电压的测量方式示于图11中。
图11引脚输入电压参照2009年3月STM32F103xCDE数据手册英文第5版(本译文仅供参考,如有翻译错误,请以英文原稿为准)29/87STM32F103xC, STM32F103xD, STM32F103xE数据手册5.1.6 供电方案图12供电方案注:上图中的4.7μF电容必须连接到VDD3。