IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 嵌入式Linux性能优化 -> 正文阅读

[嵌入式]嵌入式Linux性能优化

如何节省系统内存

目的:1、系统空闲内存尽可能多,这样可以在系统中同时运行多个进程;
1)减少常驻内存(守护进程)进程的数量;2)对于常驻内存的进程,优化内存使用;
2、系统经过长时间运行后,系统空闲内存还保持比较高的水平,这样系统性能不会下降太厉害;

查看内存使用情况
free
cat /proc/meminfo
df:查看各分区所占内存空间的大小

查看进程使用内存
top -p {pid}
cat /proc/{pid}/memmap 虚拟内存与物理内存映射表
cat /proc/{pid}/maps 进程所有用到的内存分配

内存回收机制
kswapd内核守护线程
dirty page:代码段所占用物理内存可以全部回收,堆、栈所占用物理内存全部不能回收,数据段所占用物理内存部分可以;

进程内存优化

内存的跟踪
mtrace

memory检查工具:dmalloc/valgrind(检测无效内存分配、访问未初始化内存、内存泄漏等)

栈空间优化
alloca:在栈中分配内存
1、尽量避免在栈空间申请大量内存;
2、尽量避免使用递归函数;

ELF文件
file xxx —》 查看文件格式

binutils工具包 —》 strings/strip/nm/size/readelf/objdump/ar/addr2line

readelf -a xxx

strip xxx 删除与运行无关的节
strip --remove-section=.comment xxx 删除xxx文件.comment段

nm -f sysv xxx 查看符号信息

loader加载bss和data段区别如下:
1、data初始值在data节,需要占用文件大小,当访问这些变量时,便会触发缺页故障,将文件中对应的初始值加载到内存中,完成初始化;
2、bss不占用文件大小,loader只需要将这段内存映射到一个全0的页面即可,这样.bss节并不占据ELF文件的空间;

数据段的优化:
1、尽可能减少全局变量和静态变量;
2、将只读的全局变量,加上const,将其转移到代码段;
3、不要在头文件中定义变量;
4、TODO

代码段的优化:
1、删除冗余代码;-wunused检查无用代码,-Wunreachable-code检查从未使用的代码

动态库
Todo

线程
进程拥有自己的地址空间,而线程则是完全共享的;
线程之间的数据段是完全共享的,任何一个线程都可以访问进程的全局变量;堆空间是线程共享的,每个线程都有自己的栈空间;
线程退出后,进程需要调用pthread_join结束,否则栈内存就不会释放

ulimit -a
ulimit -s 16384 设置进程栈空间大小

pthread_attr_setstacksize 设置线程栈空间大小,注意设置合理大小,防止栈溢出导致线程终止;

栈的回溯
AAPCS:子程序间调用规范
ATPCS :ARM过程调用标准(寄存器使用、数据栈、参数传递规则)

编译选项:-mapcs-frame形成标准的栈帧

系统内存优化步骤
一)在某个时间点,空闲内存太少;
1)查看tmpfs分区,是否有不再使用,但没有删除的文件;
2)统计所有进程占用的dirty page,对那些占有大量的dirty page的Top10进程,需要做内存优化;
3)减少守护进程的数量;
4)要求每个team,按照前面提的方法优化自己的内存;
二)随着时间的增长,空闲内存越来越少;
1)要求所有守护进程,检查内存泄漏的问题;
2)对于某些常用操作,做专项测试,检查是否有内存泄漏;
3)对系统进行日常使用随机测试,模拟用户使用,连续运行若干天,查看各个进程内存使用情况,如果某个进程使用内存大量增长,检查该进程内存泄漏;

如何加快运行速度

性能如何评估
灵魂拷问:性能KPI是多少?当前性能多少?优化目标多少?程序性能瓶颈在哪?

cat /proc/stat CPU运行时间统计信息
CPU 5116 0 7801 249195 60 41 55
user(51116):从系统启动开始累计到当前时刻,用户态的CPU时间;
nice(0):从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间;
system(7801):从系统启动开始累计到当前时刻,内核所占用的CPU时间;
idle(259195):从系统启动开始累计到当前时刻,出硬盘IO等待时间以外其他等待时间;
iowait(60):从系统启动开始累计到当前时刻,硬盘IO等待时间;
irq(41):从系统启动开始累计到当前时刻,硬中断时间;
softirq(55),从系统启动开始累计到当前时刻,软中断时间;

cat /proc/loadavg 检查当前系统负载情况;

性能评估工具

gprof —>统计函数调用次数和调用时间

OProfile —》查找热点函数;
http://oprofile.sourceforge.net/news/
http://people.redhat.com/wcohen/Oprofile.pdf

KFT and Gprof
需要重新编译代码,都用到了gcc里面的finstrument-functions选项,编译时在函数入口、出口加回调函数,而且inline函数也会改成非inline的

程序的优化: 1)算法和数据结构优化;2)编译器优化;3)代码优化;4)硬加速;

性能优化: 1)系统层次;2)算法层次;3)代码层次;

参数资料

参考书籍《嵌入式linux性能详解-史子旺》
blog:http://blog.chinaunix.net/30686/

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-02 11:32:57  更:2021-09-02 11:33:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:35:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码