log buffer

      log buffer 是SGA中一块循环使用的内存区域,它一般很小,因为有4个条件能够触发log buffer 中的redo 写入到log file中,缺省的设置为512kb,或者128kb*cpu_count (cpu_count由ORACLE自动设置,一般不需要更改)的最大值。

在10g中ORACLE会自动调整它的值,他遵循这样一个原则,log_buffer+fixed size 是granule size 的整数倍(其实不能完全的说是整数倍,如果是一倍,那么他们的比值可能为0.999...如果是2倍,那么他们的比值可能是1.999......以此类推)。

一般的granule value 为4194304 ,也就是4m,而fixed size 一般为 1.2m ,这个值不确定,也不精确,根据不同的平台有所差异,而默认的log_buffer+fixed size 的大小为 granule size 的整数倍,所以默认的情况下你看见的log_buffer大小约为6.67m或者为2.7M。

所以如果我们手动的设置log_buffer的值,那么ORACLE会将它加上fixed size 然后除以granule ,得到一个值,然后四舍五入,看最接近哪个整数,然后就取最接近的那个值。

      其实一般默认情况下的log_buffer的大小够用了,查看Log_buffer是否需要调整,可以查看数据库是否有大量的log buffer space等待事件出现(一般通过AWR报表)。我们知道,redo log 最开始是在pga中的uga产生的(数据库一般是专有模式),oracle会把它拷贝到SGA中的log_buffer中去,如果log_buffer过小,或者lgwr不能够快速将redo 写入到log file中,那么就会产生log buffer space等待事件,遇到此类问题,可以增加 log_buffer大小,调整log file 到裸设备,I/0快的磁盘中。

      查看granule size

SQL> select * from v$sgainfo where name='Granule Size';

NAME                                  BYTES RES
-------------------------------- ---------- ---
Granule Size                        4194304 No
      查看  fixed size (show sga ,或者 v$sgainfo视图)

SQL> show sga

Total System Global Area  629145600 bytes
Fixed Size                  1262392 bytes
Variable Size             167775432 bytes
Database Buffers          457179136 bytes
Redo Buffers                2928640 bytes

SQL> select * from v$sgainfo where name='Fixed SGA Size';

NAME                                  BYTES RES
-------------------------------- ---------- ---
Fixed SGA Size                      1262392 No
SQL> select (2928640+1262392)/4194304 from dual;

(2928640+1262392)/4194304
-------------------------
               .999219894  可以看到(fixed size + log_buffer) /granule size 约为1倍,验证了上诉理论。

在 Android 系统中,`systrace` 是一种用于系统级性能分析的工具,它通过收集来自内核和用户空间的事件信息,生成可视化的 HTML 报告,帮助开发者识别性能瓶颈。其中,`logBuffer` 是 `atrace` 命令(`systrace` 的底层实现)中的一个关键机制,用于临时存储追踪事件的缓冲区数据。 ### `logBuffer` 的作用 `logBuffer` 的主要作用是临时存储从系统中收集到的追踪事件数据。由于 `systrace` 是通过 Linux 的 `ftrace` 机制记录系统事件的,因此在事件生成时,这些数据会被写入内核中的环形缓冲区(ring buffer)。为了防止数据丢失或覆盖,`logBuffer` 提供了额外的用户空间缓冲机制,用于暂存从内核读取的事件数据[^5]。这种方式可以提高数据读取的效率,同时确保在高负载情况下仍能完整地记录性能事件。 ### `logBuffer` 的使用方法 `logBuffer` 的使用主要通过 `atrace` 命令行工具进行控制,通常与 `-z` 参数配合使用以启用压缩功能,减少缓冲区的大小。以下是一个典型的 `atrace` 命令示例,展示了 `logBuffer` 的使用: ```bash atrace -z -b 40000 am wm gfx input view -t 15 > /data/local/tmp/trace_output ``` - `-z`:启用 `logBuffer` 的压缩功能,减少内存占用。 - `-b 40000`:指定 `logBuffer` 的大小为 40000 KB,单位为千字节(KB)。 - `am wm gfx input view`:指定需要追踪的标签(TAG),如 ActivityManager、WindowManager、Graphics、Input 等。 - `-t 15`:指定追踪时间为 15 秒。 - `> /data/local/tmp/trace_output`:将生成的追踪数据保存到指定路径。 在实际使用中,`logBuffer` 的大小需要根据系统负载和追踪时间进行合理配置。如果缓冲区过小,可能导致数据丢失;而如果过大,则可能占用过多内存资源。通常建议从默认值开始调整,并根据实际情况优化[^4]。 ### `logBuffer` 的注意事项 1. **系统版本要求**:某些高级功能(如压缩和大缓冲区支持)可能需要特定的 Android 版本支持,建议使用 Android 4.3(API 级别 18)及以上版本。 2. **权限问题**:在某些设备上,使用 `atrace` 和 `logBuffer` 可能需要 root 权限,尤其是在抓取系统级事件时。可以通过 `adb root` 和 `adb remount` 命令获取权限[^5]。 3. **事件标签选择**:合理选择追踪的事件标签(TAG)可以减少 `logBuffer` 的压力,避免不必要的数据冗余。常见的标签包括 `sched`(调度)、`gfx`(图形)、`input`(输入事件)等。 ### 总结 `logBuffer` 是 `systrace` 工具链中用于高效存储追踪事件数据的重要机制,通过合理配置缓冲区大小和启用压缩功能,可以在高负载场景下保证数据完整性。开发者可以通过 `atrace` 命令行工具灵活控制 `logBuffer`,以满足不同性能分析需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值