/system/xbin/sh alto uso de CPU

Estoy usando OS Monitor para observar el uso de la CPU porque últimamente he notado una disminución drástica del rendimiento. La aplicación muestra que system/xbin/shestá consumiendo entre el 10 % y el 70 % de la CPU. Esto sucede constantemente, el proceso nunca deja de aparecer en la parte superior de la lista. Tengo dos preguntas:

  1. ¿Qué es system/xbin/sh?
  2. ¿Qué podría estar causando que utilice tanta CPU?
  3. ¿ Hay alguna manera de rastrear a qué aplicaciones hacen llamadas system/xbin/sh?

Más información:

  • Versión de Android: 4.1.2
  • Teléfono: Motorola DROID RAZR MAXX HD
  • ROM: Droid Nexesque v3.8 (ROM basado en AOSP) (a través de Safestrap)
  • Rooteado: si
  • no ejecutar ningún antivirus o similar

adb shell topproducción:

PID PR CPU% S  #THR     VSS     RSS PCY UID      Name
6214  0  97% R     1 182528K  92452K     root     /system/xbin/sh
...
6211  0   0% S     1   1428K    448K     root     /system/xbin/sh
6212  0   0% S     1  53500K  52596K     root     /system/xbin/sh    
...

adb shell psproducción:

USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
root      1     0     544    404   ffffffff 00000000 S /init
...
root      6211  1     1428   448   ffffffff 00000000 S /system/xbin/sh
root      6212  6211  53500  52596 ffffffff 00000000 S /system/xbin/sh
root      6214  6212  293976 214156 ffffffff 00000000 R /system/xbin/sh
...

cat /proc/<pid>/cmdlineproducción:

"level 1" process: /system/xbin/sh /system/bin/debuggerd
"level 2" process: /system/xbin/sh /system/etc/init.d.loader
"level 3" process: /system/xbin/sh /system/etc/init.d.loader

/system/etc/init.d.loadercontenido:

#!/system/xbin/sh
############# ############# #############
# init.d.loader by puppet13th@xda
# Version 0.7 19 June 2012
# to run script in background append .bgrun to script name
# example : "myscript.bgrun"
# ############# ############# #############
logfile=/data/init.d.loader.log
loglength=65536
bgrunsign='.bgrun'
if [ -f $logfile ]
    then
    log=`cat $logfile`
    currentloglength=`length "$log"`
    if [ $currentloglength -gt $loglength ]
    then
    rm -f $logfile  fi
fi
echo " * `date` * init.d.loader start . . .">>$logfile
echo " ">>$logfile
if [ ! -d /system/etc/init.d ]
    then
    echo "  creating init.d folder . . .">>$logfile
    mount -o remount rw /system >>$logfile 2>>$logfile
    if [ -f /system/etc/init.d ]
        then
        rm -f /system/etc/init.d >>$logfile 2>>$logfile
    fi
    mkdir /system/etc/init.d >>$logfile 2>>$logfile
mount -o remount ro /system >>$logfile 2>>$logfile
fi
echo " ">>$logfile
echo " i : running init.d scripts . . .">>$logfile
for script in /system/etc/init.d/*
do
    if [ -x $script ]
    then
    bgrun=`grep $bgrunsign $script`>/dev/null
        if [ $? = 0 ]
        then
        echo "  - running $script in background . . .">>$logfile
        /system/xbin/sh $script & >>$logfile 2>>$logfile
        else
        echo "  - running $script . . .">>$logfile
        /system/xbin/sh $script>>$logfile 2>>$logfile
        fi
    fi
done
echo " ">>$logfile
echo " * `date` * init.d.loader end . . .">>$logfile
echo " ">>$logfile

/system/bin/debuggerdcontenido:

#!/system/xbin/sh
#init.d.loader
/system/etc/init.d.loader
/system/bin/debuggerd.bin

Comprobación /data/localde cosas que otras herramientas podrían haber dejado para "conectarse init": hay cuatro carpetas vacías y un archivo llamado RootToolsMounts. /data/local/RootToolsMountscontenido:

rootfs / rootfs ro,relatime 0 0
tmpfs /dev tmpfs rw,nosuid,relatime,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,relatime,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
tmpfs /dev tmpfs rw,nosuid,relatime,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
/dev/block/platform/msm_sdcc.1/by-name/userdataorig /datamedia ext4 rw,relatime,user_xattr,barrier=1,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/userdataorig /ss ext4 rw,relatime,user_xattr,barrier=1,data=ordered 0 0
tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,relatime,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
/dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,relatime,user_xattr,barrier=1,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/userdata /data ext4 rw,nosuid,nodev,noatime,nodiratime,user_xattr,barrier=0,data=ordered,noauto_da_alloc,discard 0 0
/dev/block/platform/msm_sdcc.1/by-name/cache /cache ext4 rw,nosuid,nodev,noatime,nodiratime,user_xattr,barrier=1,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/persist /persist ext4 rw,nosuid,nodev,relatime,user_xattr,barrier=1,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/modem /firmware ext4 ro,nosuid,nodev,relatime,user_xattr,barrier=1,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/pds /pds ext3 rw,nosuid,noexec,relatime,barrier=0,data=writeback 0 0
/dev/fuse /storage/sdcard0 fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
/dev/block/vold/179:97 /storage/sdcard1 vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0

Mirando /data/init.d.loader.log(archivo de ~ 50 MB), está ejecutando los init.dscripts aproximadamente cada 10 segundos. No estoy muy familiarizado con los componentes subyacentes de Android, así que no estoy seguro de si esto es mucho o no. Los dos scripts en /system/etc/init.d./son init.d.loader.testy minfree.

/data/init.d.loader.logcontenido:

El archivo de registro se llena con estas entradas que se repiten cada 10-12 segundos

...
* Sun Feb 23 18:46:09 CST 2014 * init.d.loader
start...
i: running init.d scripts...
 - running /system/etc/init.d/init.d.loader.test...
 - running /system/etc/init.d/minfree...
* Sun Feb 23 18:46:09 CST 2014 * init.d.loader
end...
* Sun Feb 23 18:46:20 CST 2014 * init.d.loader
start...
i: running init.d scripts...
 - running /system/etc/init.d/init.d.loader.test...
 - running /system/etc/init.d/minfree...
* Sun Feb 23 18:46:20 CST 2014 * init.d.loader
end...
...

init.d.loader.testcontenido:

#!/system/xbin/sh
# init.d.loader tester
# check /data/init.d.loader.test
echo init.d.loader test >/data/init.d.loader.test

minfreecontenido:

#!/system/xbin/sh
echo "2469,4938,6584,33756,36971,40186" > /sys/module/lowmemorykiller/parameters/minfree
pd: has leido esto
@ t0mm13b Lo he leído, pero eso no parece ayudar a mi problema. Agregué las salidas psy toppara /system/xbin/sh. No estoy seguro de si esto ayudará. Si esto no ayuda, probablemente voy a borrar la ROM y empezar de nuevo. Será más fácil que reducirlo aplicación por aplicación.
Parece que este script está entrando en un bucle infinito o algo así. ¿Puede verificar el contenido del archivo de registro de los scripts: /data/init.d.loader.log y observarlo durante los próximos cinco minutos si el archivo de registro cambia o se escribe en él?
Para lo que se supone que debe hacer el script, solo debe ejecutarse una vez en el arranque en mi humilde opinión. Por cierto: me /data/local/RootToolsMountsparece una forma de fstab(pero definitivamente no está causando problemas aquí).
@StrangerLoop: ¿Su ROM viene con la caja ocupada? Si es así, ¿puede usar el tail <filename>comando para verificar que se muestren las últimas líneas en el archivo de registro? Unas quince líneas deberían ser suficientes por ahora. Comando de cola:tail -n 15 /data/init.d.loader.log
Desde el script, eso parece muy sospechoso, si fuera usted OP, perseguiría al tipo en XDA ( puppet13th@xda ) y averiguaría exactamente por qué está recorriendo todos los scripts en el etcdirectorio, volviendo a montar el sistema como reescribible sin su conocimiento y ejecutarlos en segundo plano. Mi conclusión de leer lo anterior es que este es un script falso como parte de un proceso de enraizamiento, que se deslizó, mirar su /proc/pid/cmdlinenivel 2 es motivo de preocupación inti.d.loader(¿se pegó esto o fue un error tipográfico?) Eso es inaudito.
@ t0mm13b Definitivamente un error tipográfico, debería decir init.d.loader. Me puse en contacto con el desarrollador de la ROM en droidrzr.com (el hilo en ese sitio es el que actualiza el desarrollador). También intentaré ponerme en contacto con puppet13th en xda.
Me alegro de que sea un error tipográfico, entonces... :)
Mi suposición actual es que el script tomó mucho tiempo de CPU porque usa una forma muy ineficiente de calcular la longitud del archivo de registro, que es leer todo el archivo de registro en la memoria y usar length. Esto no debería haber sido un gran problema si el archivo de registro es pequeño, pero dado que dijo que el tamaño actual del archivo de registro es de más de 50 MB, esto muestra que el archivo de registro no se recorta correctamente. Otro problema preocupante es que se supone que los scripts de inicio solo se ejecutan una vez al inicio, pero obviamente este script se ejecuta periódicamente.
Si mi suposición es correcta, es posible que pueda solucionar esto temporalmente eliminando el archivo de registro, pero eventualmente la ralentización ocurrirá nuevamente cuando el archivo de registro se llene nuevamente. Compruebe si tiene la última versión de su ROM, ¿tal vez esté arreglado en la última versión? De lo contrario, si se trata de una ROM sin mantenimiento, deberá encontrar una forma de corregir el script.
@LieRyan ¡Tenías razón! Eso solucionó el problema por ahora, pero como dijiste, con el tiempo volverá a aparecer. Desafortunadamente, estoy en la última versión de la ROM. Me pondré en contacto con el desarrollador de ROM y el desarrollador que escribió init.d.loader. Gracias por la ayuda de todos. ¡Te lo agradezco!

Respuestas (2)

Mi suposición actual es que el script tomó mucho tiempo de CPU porque usa una forma muy ineficiente de calcular la longitud del archivo de registro, que es leer todo el archivo de registro en la memoria y usar length. Esto no debería haber sido un gran problema si el archivo de registro es pequeño, pero dado que dijo que el tamaño actual del archivo de registro es de más de 50 MB, esto muestra que el archivo de registro no se recorta correctamente. Otro problema preocupante es que se supone que los scripts de inicio solo se ejecutan una vez al inicio, pero obviamente este script se ejecuta periódicamente.

Si mi suposición es correcta, es posible que pueda solucionar esto temporalmente eliminando el archivo de registro, pero eventualmente la ralentización ocurrirá nuevamente cuando el archivo de registro se llene nuevamente. Compruebe si tiene la última versión de su ROM, ¿tal vez esté arreglado en la última versión? De lo contrario, si se trata de una ROM sin mantenimiento, deberá encontrar una forma de corregir el script.

Solo estoy ADIVINANDO, pero ¿ha intentado reducir el tamaño del búfer de registro? La función aparece en Opciones de desarrollo >Settings>Developer Options>Logger Buffer Size

El wiki de la comunidad no es para respuestas como esta, es para respuestas "canónicas" a las que toda la comunidad debería contribuir.