xml地图|网站地图|网站标签 [设为首页] [加入收藏]

智能硬件

当前位置:美高梅游戏网站 > 智能硬件 > 美高梅游戏官网娱乐嵌入式linux的调试技术

美高梅游戏官网娱乐嵌入式linux的调试技术

来源:http://www.gd-chuangmei.com 作者:美高梅游戏网站 时间:2019-09-02 13:42

linux后端诊断与调试技术

本文不是liunx命令使用教程,也不打算全方面阐明其用法,互联网公司项目很多,服务程序之间相互依赖调用很复杂,各种因素会影响线程服务正常运行,特别是基础服务组件更是如此,当出现各种问题时,如何诊断linux下哪个环节出现问题或状况。从linux系统层面看,通过各种操作命令和手段快速定位线上程序的症状和要害很有必要。比如说:当线上服务长时间正常运行,张三某天突然监控到自己的程序出问题了,自己负责某个程序不提供服务或服务处于挂死(进程还在,但无法接收外部响应)状态,查看应用程序日志没发现明显错误或可提示信息(看了隐藏比较深),可能(压力比较大,时间紧迫)经验丰富开发工程师也一时半会找不出症状所在,笔者想尽量覆盖关键和重要部分分享给读者,以期待提供有价值可参考的依据,笔者更想提供一些自己遇到问题的解决方法和思路作为大家的参考,但限于水平限制,难免有疏漏和不足之处,欢迎大家提出宝贵意见和想法以帮助我更正或提高。

下面出现的问题是工程师日常开发中真实写照。
美高梅游戏官网娱乐 1

  1、打印内核调试信息:printk函数的原型:

诊断技术与调试解释

美高梅游戏官网娱乐 2
笔者从上述6个方面扩展到多个维度剖析,应用程序或服务出现问题的症状所在,正因为互联网公司特殊性,技术工程师流动相对比较频繁,岗位变更交接等原因,造成了后来接手人(新手)无法及时应对线上出现各种状况。或因为经验不足,或因为对线上情况不了解等,增加了很多不确定因素。如果我们有一套简单通用可行检测和衡量规则,就大大降低风险。希望能通过这个参考手册的帮助,分析大量在线参数数据并从中找到蛛丝马迹,也能缩小排查有问题程序的范围。

正因为程序出现问题需要诊断和调试,那需要通过分析和判断哪些方面因素会引起linux性能波动。
孙子.谋攻
知己知彼,百战不殆;
不知彼而知己,一胜一负;
不知彼,不知己,每战必殆。

  asmlinkage int printk(const char *fmt,...)第1个参数表示格式字符串,后面是可变参数。第一个参数值前面加尖括号包含的数字表示输出的日志级别,共有8个级别,在linux/kernel.h头文件中定义。不管消息级别是多少,所有通过printk函数发出的消息都会输出到日志文件(就算有的消息输出到控制台,也会同时输出到日志文件)。

影响Linux性能因素

操作系统
CPU
内存
磁盘I/O及性能
网络I/O状况及性能

  2、防止printk函数降低linux驱动性能:虽然使用printk函数可以很方便地将消息写入日志文件或控制台,但大量使用printk函数频繁操作日志文件或控制台设备文件(/dev/console)会严重影响linux驱动的性能,因此,这就要求linux驱动只在开发阶段使用printk函数输出消息,在正式发布linux驱动是时将可能影响性能的printk函数去掉,通过利用C语言中的编译指令(#if#else#endif等)。

linux系统性能评估标准

美高梅游戏官网娱乐 3

:关于swap和paging含义后面有名称解释

 

 

  3、在linux文件系统中,/proc经常被用来作为内核空间与用户空间进行数据交互的工具。/proc是虚拟文件系统,是内存映射。所有读写/proc的操作都是对内存的读写,所以读写/proc文件系统的速度要远比读写/dev文件系统的速度快,因此,/proc文件系统也可以作为linux驱动与用户空间程序交互的工具,将很多信息通过/proc文件系统由内核空间的程序向外界提供。

linux 系统性能分析命令或工具

 

 

  4、linux系统中有很多命令(如free)就是通过分析/proc/meminfo文件的内容来显示系统内存资源的。

常用命令:

 

dstat,vmstat、sar、iostat、netstat、free、ps、top等

  5、在linux驱动程序中可以使用内核函数在/proc目录中创建和删除虚拟文件,也可以建立和删除虚拟目录。

性能分析和诊断工具

用vmstat、sar、iostat检测是否是CPU、磁盘,内存瓶颈
用free、vmstat检测是否是内存、IO瓶颈
用iostat检测是否是磁盘I/O瓶颈
用dstat检测是否是网络带宽、磁盘io、内存、负载等综合瓶颈分析
用mpstat检测是否cpu调用不均衡,也可以使用top替代
用pidstat检测相应进程cpu消耗情况
用netstat检测socket buffer有未发送或处理的数据,从而判断程序处理能力下降或出现问题.
用lsof检测打开文件描述(网络文件和磁盘文件,管道等)符过多,导致资源不足
用df和du组合检测挂载磁盘或目录占用空间巨大或inode节点消耗殆尽。
用iftop检查2台主机间是否存在流量瓶颈.

  6、/pron 文件系统主要通过proc_dir_entry.read_proc和proc_dir_entry.read_write函数指针来设置读写/pron目录中的虚拟文件的动作处理函数,proc_dir_entry结构体代表一个虚拟目录或文件。

下面命令中参数名词解释:

buffer是用于存放(缓存)要输出到disk(块设备)的数据的,

cache是存放从disk上读出的数据。这buffer和cache是为了提高IO性能的,并由OS管理。

swap: linux内核读写虚拟内存是以 “页” 为单位操作的,把内存转移到硬盘交换空间(SWAP)和从交换空间读取到内存 的时候都是按页来读写的。

Paging:内存和SWAP的这种交换过程称为页面交换(Paging)

 

  7、调试工具:用于调试用户空间程序的gdb、gdbserver和调试内核空间程序的kgdb工具可以逐行跟踪程序的代码。gdb可以跟踪调试用户空间的程序,只能在PC上进行测试;用gdbserver 测试运行在开发板、手机或Android模拟器上的程序。gdbserver是一个可以运行在ARM架构上的服务端程序,在开发板上使用gdbserver打开要测试的程序,然后通过串口、有线或无线网络可以在PC上进行调试;kgdb远程调试内核程序,最好的内核调试工具。提供类似printk函数的复制输出功能,允许开发人员直接在PC上通过GDB链接目标设备

Linux - top

  8、当发现某些代码的bug太多或很难通过printk函数输出信息找出,可以考虑使用kgdb用step by step的方式定位bug。

top

shift + h 按线程查看cpu消耗情况
查看每个核消耗情况
us 过高说明应用程序消耗了大部分cpu
sy 过高表示系统线程切换频繁
wa 表示为在执行过程中等待io所占的百分比 hi 硬件中断(ex:网卡接收数据频发)
top -p pid 多列信息列表中直显示对应进程信息. 美高梅游戏官网娱乐 4

 

                                                                                           17:03:16

Linux - free

                                                                                          2016-07-03

free -m

美高梅游戏官网娱乐 5

 

-/+ buffers/cache

used应用程序总共使用的内存数=Mem.used-Mem.buffers-Mem.cached

应用程序还未使用的内存数=Mem.free+Mem.buffers+Mem.cached

上面是free -m的运行结果,一共有4行。为了方便说明,笔者加上了列号。这样可以把free的输出看成一个二维数组rowcols(Free Output),下面可以使用2个等式表示两个等式

rowcols[3][2] = rowcols[2][2] - rowcols[2][5] - rowcols[2][6]

rowcols[3][3] = rowcols[2][3] + rowcols[2][5] + rowcols[2][6]

:free命令中内存参数与top中第四行,五行--对应,top就是少了free第三行参数值

Linux - netstat / ss

netstat –an | grep 端口

美高梅游戏官网娱乐 6

Recv-Q 网络接收队列 一般情况为0,如果持续为非0表示收到的数据已经在本地接收缓冲,应用程序还没处理,可能是应用程序处理性能下降。

Send-Q 发送队列 一般情况为0,如果持续为非0可能是应用向外发送数据包过快,或者是 对方接收数据包不够快。

netstat –an | grep 端口 (查看应用程序端口是否正常监听)

以前遇到过分布式缓存memcached在高峰访问中会出现这种现象,由于高峰时期极端情况下多线程lock内存池原因,导致服务端性能急剧下降。

 

Linux - vmstat

vmstat 1 10

 

vmstat CPU使用率,内存使用,虚拟内存交换情况,IO读写情况

一般使用格式为:vmstat interval count //表示输出频率1秒,连续输出10次

使用实例: vmstat 1 10

美高梅游戏官网娱乐 7

 

如果CPU的sy和us值相加的百分比接近100%,或者运行队列(r)中等待 的进程数总是不等于0,且经常大于4,同时id也经常小于40,则该系 统受限于CPU;如果bi、bo的值总是不等于0,则该系统受限于内存。 swpd值过高一般情况由于物理内存不够用.

free列表示当前空闲的物理内存数量(以k为单位)
buff列表示buffers cache的内存数量,一般对块设备的读写才需要缓冲。
memory
cache列表示page cached的内存数量,一般作为文件系统cached,频繁访问的文件都会被cached,如果cache值较大,说明cached的文件数较多,如果此时IO中bi比较小,说明文件系统效率比较好。
swap

si列表示由磁盘调入内存,也就是内存进入内存交换区的数量。
so列表示由内存调入磁盘,也就是内存交换区进入内存的数量。 
一般情况下,si、so的值都为0,如果si、so的值长期不为0,则表示系统内存不足。需要增加系统内存。

in 每秒CPU的中断次数
cs 每秒上下文切换次数 //如果上下文切换过多(远高于平常数值),则可能是线程创建过多
us 用户CPU时间占百分比
sy 系统CPU时间占百分比
id 空闲 CPU时间占百分比
wt 等待IO

Linux - sar

sar 1 10

格式如下:sar -d interval count

美高梅游戏官网娱乐 8

 

需要关注几个参数:

await表示平均每次设备I/O操作的等待时间(以毫秒为单位)。
svctm表示平均每次设备I/O操作的服务时间(以毫秒为单位)。
%util表示一秒中有百分之几的时间用于I/O操作。

利用sar作性能评估

磁盘IO性能,一般有如下评判标准:

正常情况下svctm应该是小于await值的,而svctm的大小和磁盘性能有关,CPU、内存的负荷也会对svctm值造成影响,过多的请求也会间接的导致svctm值的增加。await值的大小一般取决与svctm的值和I/O队列长度以及I/O请求模式,如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢,此时可以通过更换更快的硬盘来解决问题。
%util项的值也是衡量磁盘I/O的一个重要指标,如果%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷的在工作,该磁盘可能存在瓶颈。长期下去,势必影响系统的性能,可以通过优化程序或者通过更换更高、更快的磁盘来解决此问题。

本文由美高梅游戏网站发布于智能硬件,转载请注明出处:美高梅游戏官网娱乐嵌入式linux的调试技术

关键词:

上一篇:CentOS安装openfire

下一篇:没有了