自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 Android性能分析工具perfetto (2)pefetto原理简析

函数运行时长是怎么来的呢?在发送端,桩函数trace_binder_transaction记录binder_transaction的debug_id、对端线程tid等信息,对端收到后在trace_binder_transaction_received记录收到binder_transaction的debug_id,写ring buffer会自动记录本线程的tid,这样可视化工具就能通过debug_id和tid将两端联系起来。trace_sched_switch会记录切换前后两个进程的优先级、状态等信息。

2023-10-08 20:05:18 795

原创 Android性能分析工具perfetto (1)pefetto抓trace

perfetto依赖traced、traced_probes等进程,首先检查这两个进程是否已经启动,如果没有启动,则设置属性adb shell setprop persist.traced.enable 1启动这些进程。如下界面中选取抓取哪些模块的atrace,并且配置ring buffer的大小,和间隔多久去读取ring buffer。(1)把配置文件push到手机,要放到shell用户有权限访问的目录,一般放在/data/misc/perfetto-configs/(2)抓取trace。

2023-10-08 19:52:06 615

原创 Android性能分析工具trace event (2)trace event抓取

buffer_size_kb:每个CPU对应的ring buffer长度,以kb为单位,trace日志保存在ring buffer中,越大缓存的日志越多。buffer_total_size_kb:ring buffer总长度,等于CPU个数乘以buffer_size_kb。trace_pipe:打印ring buffer中缓存的trace日志,打印完后不退,有新日志写入时,继续打印。tracing_on:ring buffer开关节点,如果不打开,没有地方保存trace日志。

2023-10-06 21:24:06 167

原创 Android性能分析工具trace event (1)trace event框架

一个trace_event_file对应一个trace_event_call,一个trace_event_call对应一个trace_event_class,首先要在events目录下创建trace_event_class同名目录,存放在global_trace的成员struct list_head systems内核链表中,再在trace_event_class同名目录下创建tracepoint同名目录。struct static_key key为false,其余三个成员均为null。

2023-09-25 19:00:08 268

原创 Android性能分析工具strace (4)strace流程之系统调用参数解析

可以看出,在ARM64上,系统调用号保存在x8寄存器,参数arg1--arg6,保存在x0--x5寄存器中,返回值时,将返回值保存在x0寄存器。不同平台的arch_get_scno()函数实现不一样,ARM64的实现代码如下,可以看出,ARM64是从x8寄存器读取的系统调用号。open系统调用的参数解析规则如下,第一个参数为打开文件路径,第二参数为打开标志,当第二个参数含有O_CREAT或STRACE_O_TMPFILE时,存在第三各参数新建文件权限。(*sys_func)()为参数解析函数。

2023-09-18 20:18:28 165

原创 Android性能分析工具strace (3)strace流程之strace等待目标进程通知

ptrace_do_wait()-->wait_task_stopped()调用task_stopped_code()获取子进程退出码,然后将退出码拷贝到 wait4 ()的 int *status参数指向的地址(该地址保存在 wo->wo_stat),这样strace在退出wait4() 时子进程的退出码就保存到了 int *status参数指向的地址。设置进程为可中断睡眠状态,然后调用schedule()进入可中断睡眠状态,等待被跟踪进程在系统调用时会唤醒自己。调用ptrace_notify()。

2023-09-13 20:00:27 251

原创 Android性能分析工具strace (2)strace流程之ptrace跟踪目标进程系统调用

ptrace定义为long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data),参数 request是请求类型,其中PTRACE_ATTACH用于建立tracer和tracee关系,PTRACE_SYSCALL用于跟踪pid对应tracee的系统调用。ptrace_request()根据请求类型的不同调用不同的函数处理,PTRACE_SYSCALL请求类型对应的是ptrace_resume()。

2023-09-11 19:24:11 374 1

原创 Android性能分析工具strace (1)strace使用简介

strace用于跟踪系统调用,Android系统提供了strace源码,位于externa l/strace。把strace添加到PRODUCT_PACKAGES,重新编译即可在system/bin目录下找到strace。Filtering选项,添加过滤条件,-e指定跟踪某些系统调用,-P指定跟踪对某文件的系统调用。例如strace -p 11953,跟踪pid为11953进程的系统调用。-c统计系统调用时间,-C统计系统调用时间,同时控制台有打印。-T打印每个系统调用的耗时。

2023-09-05 23:50:39 384 1

原创 CFS调度器理解

为了能够按优先级为任务分配CPU时间,引入了权重概念,每个优先级(nice:-20--19)都对应一个权重(具体值见数组sched_prio_to_weight),优先级越高权重值越大,nice为0的权重是1024(NICE_0_LOAD),总的权重为队列上所有处于可运行状态CFS调度实体权重之和。可以看出,所有任务的运行时间通过一个比例(NICE_0_LOAD/task_weight)缩放后,都会等于同一个时间,把这个缩放后的时间称为虚拟运行时间,nice为0的任务虚拟运行时间等于实际运行实际。

2023-08-27 15:49:22 133

原创 RT调度器源码简析

RT调度器pick_next_task接口对应的函数是pick_next_task_rt(),首先通过位图找到有可运行状态任务的最高优先级,然后通过优先级找到对应的内核链表,最后选择内核链表第一个成员作为接下来运行的任务。RT调度器对应的调度实体抽象为结构体struct sched_rt_entity,调度器中的任务都有属于自己的调度实体,例如struct task_struct结构体中就包含成员struct sched_rt_entity rt。

2023-08-24 23:18:40 114 1

原创 Linux进程优先级理解

分享了对 struct task_struct中四个表示优先级的成员:prio、static_prio、 normal_prio、rt_priority的理解

2023-08-21 21:00:45 218 1

原创 Linux调度器简介

根据进程的特点,需要采取不同的调度策略,以5.10内核为例,共有6种类型的调度策略:SCHED_NORMAL、SCHED_FIFO、 SCHED_RR、SCHED_BATCH、SCHED_IDLE、SCHED_DEADLINE。在进程创建时,子进程prio继承父进程的normal_prio,然后根据进程的prio选择调度器,优先级0-99为RT调度器,100-139为完全公平调度器,新建任务的调度类器不能是DEADLINE。每个任务都有对应的调度器,调度器是有优先级的,优先级从高到低依次为。

2023-08-16 23:51:58 161 1

原创 Linux进程绑核

介绍了进程绑核原理,以及绑核方法:系统调用sched_setaffinity()绑核;taskset绑核;cpuset绑核

2023-08-11 23:44:41 582 1

原创 uclamp对调频和选核的影响

cpu.uclamp.min/cpu.uclamp.max是负载钳制的下限和上限,表示的是百分比,为浮点数,精确的小数点后两位,取值范围是0-100,对应的值是1024*设置值/100。进程控制块struct task_struct定义了两个与uclamp相关的成员,struct uclamp_se uclamp_req[]用户空间请求的参数,struct uclamp_se uclamp[]当前生效的参数。桶的水位计算规则为:(1)当桶中没有任务时,第一个入桶任务的uclamp即为桶的水位;

2023-08-09 22:04:28 1222

原创 EAS调度简析

遍历每个性能域中的每一个CPU,计算假如进程迁移到这个CPU后的功耗增量,选择功耗增量最小的那个CPU。例如,当一个cluster中的CPU负载分布如下图所示,调频策略会根据cluster中最大的CPU负载来设定目标频率,这样虽然满足了CPU1对性能的需求,但是对于其它CPU来说,这样的性能显然是比较浪费的。再如下图所示,0-3是小核,4-7是大核,所有核上的负载都不高,完全可以由小核去运行,就像一个货物本来可以用一辆轿车来运输的,却用了大卡车来运算,这样能效比当然低。来存储CPU的频率功耗信息。

2023-08-03 21:50:18 651

原创 schedutil调频流程分析

但是没有接口能够知道,系统接下来的一段时间需要多少性能,只能用过去的负载预测当前的需求。sugov_init()的主要任务是创建sugov_policy,sugov_policy是schedutil策略的抽象,成员struct sugov_tunables *tunables是向用户程序提供的调参集合,可调的参数包括:min_rate_limit_ns两次调频之间的最小时间间隔,up_rate_delay_ns连续两次升频之间的最小时间间隔,down_rate_delay_ns连续两次降频之间的时间间隔。

2023-07-31 21:08:41 910 1

原创 WALT负载计算

freq_scale是某CPU当前频率运算能力的瓷都化,系统定义当前核最高频率运行时的freq_scale为1024,其它频率的freq_scale为当前频率运算能力/最高频率运算能力*1024。其中mark_start是上一次统计的时间,sum指进程在当前窗口已经运行的WALT时间,数组sum_history[RAVG_HIST_SIZE_MAX]保存进程在前5个历史窗口期内的WALT时间,demand是由sum_history[]历史数据推算出的值。《奔跑吧Linux内核》

2023-07-25 23:00:54 605

原创 MTK温控简介

Linux的Thermal机制是基于Zone为单位的热管理机制,核心包括三个部分:获取区域温度的设备thermal_zone_device,对区域降温的设备thermal_cooling_device,温控策略thermal_governor。thermal_zone_device注册:调用thermal_zone_device_register()注册thermal_zone_device,所有注册的区域温度采集设备,链接到thermal_tz_list。注册thermal_zone_device。

2023-07-24 22:28:01 1179

原创 [Android Cgroup层次关系] 四、Cgroup与进程关系

mount过子系统后,再有子进程创建时cgroup_post_fork()会进入if (use_task_css_set_links)分支,用父进程的css_set作为子进程的css_set,并把子进程链接到该css_set中。cgroup_attach_task()首先调用cgroup_migrate_add_src(),准备好源cgroup(src_cset->mg_src_cgrp)和目的cgroup(src_cset->mg_dst_cgrp)。顾名思义,就是子系统状态的集合。

2023-07-17 22:23:02 438 1

原创 [Android Cgroup层次关系] 三、创建分组

cgroup的成员struct cgroup_subsys_state self用于建立cgoup之间的关系:cgroup_subsys_state的parent指向父cgoup包含的cgroup_subsys_state,cgroup_subsys_state的list_head sibling链入到父cgoup包含cgroup_subsys_state的list_head children。第二,调用cgroup_apply_control_enable()建立新建Cgroup与子系统的关系。

2023-06-29 23:43:38 390 1

原创 [Android Cgroup层次关系] 二、mount子系统

cgroup_mount()首先为cgroup_root分配内存,然后调用init_cgroup_root()初始化cgroup_root,init_cgroup_root()建立与子系统的关系,将子系统的struct cgroup_root *root指向新创建的cgroup_root,struct cgroup_subsys_state的*cgroup成员指向新创建cgroup_root包含的cgroup,从而建立其新创建cgroup与子系统的联系。下一步是调用rebind_subsystems()

2023-06-29 23:31:31 398 1

原创 [Android Cgroup层次关系] 一、Cgroup初始化

全局变量struct cgroup_subsys *cgroup_subsys[]是所有子系统的集合,在cgroup_init_early()中初始化各个分组的id和name。init_and_link_css()中struct cgroup_subsys_state的成员struct cgroup *cgroup指向cgroup,成员struct cgroup_subsys *ss指向对应子系统struct cgroup_subsys,建立起cgroup与cgroup_subsys之间的联系。

2023-06-28 23:22:30 674 1

原创 Linux netlink机制源码浅析

_netlink_kernel_create()创建并初始化netlink_sock(包含sock)后,再调用netlink_insert(),以端口号(kernel固定为0)和net构建键值,并将sock的指针存放在hash表中以便查找。__netlink_kernel_create()首先调用sock_create_lite()创建socket结构体,然后调用__netlink_create()创建netlink_sock(包含sock),并初始化成员。如果没有数据则休眠等待,休眠超时后再次查看。

2023-06-25 17:39:10 554 1

原创 Android系统目录树建立过程

do_add_mount()-->graft_tree()-->attach_recursive_mnt()先调用mnt_set_mountpoint()建立起子mount与父mount之间的关系,再调用commit_tree()-->__attach_mnt()将子mount加入到hash表mount_hashtable中,该哈希表的键值由父mount和挂载目标目录组成。mount_fs()调用对应文件系统类型的mount接口,来创建对应文件系统的super_block和根目录。

2023-06-19 22:21:12 695

原创 Linux Input子系统源码分析

input_dev注册的一个重要任务就是将input_dev链入到input_dev_list中。应用程序打开节点时,会调用evdev_open创建evdev_client并放到文件的private_data中,evdev_client链入到evdev的client_list中,可见打开一次创建一个evdev_client。input_handler注册函数会将input_handler都链入input_handler_list中,并遍历input_dev_list检查是否有input_dev与之匹配。

2023-06-10 18:22:49 227 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除