128 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
| #!/system/bin/sh
 | |
| 
 | |
| # Copyright (C) 2021 The Android Open Source Project
 | |
| #
 | |
| # Licensed under the Apache License, Version 2.0 (the "License");
 | |
| # you may not use this file except in compliance with the License.
 | |
| # You may obtain a copy of the License at
 | |
| #
 | |
| #      http://www.apache.org/licenses/LICENSE-2.0
 | |
| #
 | |
| # Unless required by applicable law or agreed to in writing, software
 | |
| # distributed under the License is distributed on an "AS IS" BASIS,
 | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| # See the License for the specific language governing permissions and
 | |
| # limitations under the License.
 | |
| 
 | |
| 
 | |
| # Periodically arms a perfetto trace config for mm_events
 | |
| # The config is triggered by the mm_events kmem_activity trigger
 | |
| # This script gets executed as a oneshot service from perfetto.rc
 | |
| # when persist.mm_events.enabled is set to true.
 | |
| 
 | |
| DEFAULT_TRACE_CONFIG=<<EOF
 | |
| unique_session_name: "perfetto_mm_events_session"
 | |
| 
 | |
| bugreport_score: 100
 | |
| 
 | |
| buffers: {
 | |
|   size_kb: 512
 | |
|   fill_policy: DISCARD
 | |
| }
 | |
| 
 | |
| data_sources: {
 | |
|   config {
 | |
|     name: "linux.sys_stats"
 | |
|     sys_stats_config {
 | |
|       vmstat_period_ms: 500
 | |
|       vmstat_counters: VMSTAT_NR_FREE_PAGES
 | |
|       vmstat_counters: VMSTAT_NR_SLAB_RECLAIMABLE
 | |
|       vmstat_counters: VMSTAT_NR_SLAB_UNRECLAIMABLE
 | |
|       vmstat_counters: VMSTAT_NR_ACTIVE_FILE
 | |
|       vmstat_counters: VMSTAT_NR_INACTIVE_FILE
 | |
|       vmstat_counters: VMSTAT_NR_ACTIVE_ANON
 | |
|       vmstat_counters: VMSTAT_NR_INACTIVE_ANON
 | |
|       vmstat_counters: VMSTAT_WORKINGSET_REFAULT
 | |
|       vmstat_counters: VMSTAT_WORKINGSET_ACTIVATE
 | |
|       vmstat_counters: VMSTAT_NR_FILE_PAGES
 | |
|       vmstat_counters: VMSTAT_PGPGIN
 | |
|       vmstat_counters: VMSTAT_PGPGOUT
 | |
|       vmstat_counters: VMSTAT_PSWPIN
 | |
|       vmstat_counters: VMSTAT_PSWPOUT
 | |
|       vmstat_counters: VMSTAT_PGSTEAL_KSWAPD_DMA
 | |
|       vmstat_counters: VMSTAT_PGSTEAL_KSWAPD_NORMAL
 | |
|       vmstat_counters: VMSTAT_PGSTEAL_KSWAPD_MOVABLE
 | |
|       vmstat_counters: VMSTAT_PGSTEAL_DIRECT_DMA
 | |
|       vmstat_counters: VMSTAT_PGSTEAL_DIRECT_NORMAL
 | |
|       vmstat_counters: VMSTAT_PGSTEAL_DIRECT_MOVABLE
 | |
|       vmstat_counters: VMSTAT_PGSCAN_KSWAPD_DMA
 | |
|       vmstat_counters: VMSTAT_PGSCAN_KSWAPD_NORMAL
 | |
|       vmstat_counters: VMSTAT_PGSCAN_KSWAPD_MOVABLE
 | |
|       vmstat_counters: VMSTAT_PGSCAN_DIRECT_DMA
 | |
|       vmstat_counters: VMSTAT_PGSCAN_DIRECT_NORMAL
 | |
|       vmstat_counters: VMSTAT_PGSCAN_DIRECT_MOVABLE
 | |
|       vmstat_counters: VMSTAT_COMPACT_MIGRATE_SCANNED
 | |
|       vmstat_counters: VMSTAT_COMPACT_FREE_SCANNED
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| data_sources: {
 | |
|   config {
 | |
|     name: "linux.ftrace"
 | |
|     ftrace_config {
 | |
|       ftrace_events: "vmscan/mm_vmscan_kswapd_wake"
 | |
|       ftrace_events: "vmscan/mm_vmscan_kswapd_sleep"
 | |
|       ftrace_events: "vmscan/mm_vmscan_direct_reclaim_begin"
 | |
|       ftrace_events: "vmscan/mm_vmscan_direct_reclaim_end"
 | |
|       ftrace_events: "compaction/mm_compaction_begin"
 | |
|       ftrace_events: "compaction/mm_compaction_end"
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| trigger_config {
 | |
|   trigger_mode: START_TRACING
 | |
|   trigger_timeout_ms: 3600000
 | |
|   triggers {
 | |
|     name: "kmem_activity"
 | |
|     stop_delay_ms: 360000
 | |
|   }
 | |
| }
 | |
| EOF
 | |
| 
 | |
| VENDOR_TRACE_CONFIG="/vendor/etc/mm_events.cfg"
 | |
| 
 | |
| BASE_SLEEP=30
 | |
| SLEEP=$BASE_SLEEP
 | |
| BACKOFF_MULTIPLIER=2
 | |
| CONSECUTIVE_FAILURES=0
 | |
| FAILURES_THRESHOLD=10
 | |
| 
 | |
| # Keep the mm events perfetto trace config armed
 | |
| while :
 | |
| do
 | |
|     sleep $SLEEP
 | |
| 
 | |
|     # If an alternate vendor trace config exists use that instead of the default.
 | |
|     if [ -f "$VENDOR_TRACE_CONFIG" ]; then
 | |
|         /system/bin/perfetto -c "$VENDOR_TRACE_CONFIG" --txt -o /dev/null
 | |
|         EXIT_CODE=$?
 | |
|     else
 | |
|         echo "$DEFAULT_TRACE_CONFIG" | /system/bin/perfetto -c - --txt -o /dev/null
 | |
|         EXIT_CODE=$?
 | |
|     fi
 | |
| 
 | |
|     if [[ $EXIT_CODE -ne 0 ]]; then
 | |
|         SLEEP=$(($SLEEP * $BACKOFF_MULTIPLIER))
 | |
| 
 | |
|         CONSECUTIVE_FAILURES=$(($CONSECUTIVE_FAILURES + 1))
 | |
|         if [ $CONSECUTIVE_FAILURES -ge $FAILURES_THRESHOLD ]; then
 | |
|             exit 1
 | |
|         fi
 | |
|     else
 | |
|         SLEEP=$BASE_SLEEP
 | |
|         CONSECUTIVE_FAILURES=0
 | |
|     fi
 | |
| done
 |