¿Cómo aumento el límite de bytes / proc / pid / cmdline 4096?
Pregunta
Para mis aplicaciones Java con rutas de clase muy largas, no puedo ver la clase principal especificada cerca del final de la lista arg cuando uso ps. Creo que esto se deriva del límite de tamaño de mi sistema Ubuntu en / proc / pid / cmdline. ¿Cómo puedo aumentar este límite?
Solución
No puede cambiar esto dinámicamente, el límite está codificado en el núcleo a PAGE_SIZE en fs / proc / base.c:
274 int res = 0;
275 unsigned int len;
276 struct mm_struct *mm = get_task_mm(task);
277 if (!mm)
278 goto out;
279 if (!mm->arg_end)
280 goto out_mm; /* Shh! No looking before we're done */
281
282 len = mm->arg_end - mm->arg_start;
283
284 if (len > PAGE_SIZE)
285 len = PAGE_SIZE;
286
287 res = access_process_vm(task, mm->arg_start, buffer, len, 0);
Otros consejos
Para observar los procesos Java jps es muy útil.
Esto le dará la clase principal y los argumentos de jvm:
jps -vl | grep <pid>
Me salgo temporalmente de la limitación de argumento de la línea de comando de 4096 caracteres de ps (o más bien / proc / PID / cmdline) es mediante el uso de un pequeño script para reemplazar el comando java.
Durante el desarrollo, siempre uso una versión JDK desempaquetada de SUN y nunca uso el JRE o JDK instalado del sistema operativo sin importar si es Linux o Windows (por ejemplo, descargue el bin versus el rpm.bin). No recomiendo cambiar el script para su instalación predeterminada de Java (por ejemplo, porque podría interrumpir las actualizaciones o sobrescribirse o crear problemas o ...)
Entonces, suponiendo que el comando java esté en /x/jdks/jdk1.6.0_16_x32/bin/java
primero aleje el binario real:
mv /x/jdks/jdk1.6.0_16_x32/bin/java /x/jdks/jdk1.6.0_16_x32/bin/java.orig
luego cree un script /x/jdks/jdk1.6.0_16_x32/bin/java como por ejemplo:
#!/bin/bash
echo "$@" > /tmp/java.$.cmdline
/x/jdks/jdk1.6.0_16_x32/bin/java.orig $@
y luego hacer que el script sea ejecutable
chmod a+x /x/jdks/jdk1.6.0_16_x32/bin/java
en caso de copiar y pegar lo anterior, debe asegurarse de que no haya espacios adicionales en /x/jdks/jdk1.6.0_16_x32/bin/java y #! / bin / bash es la primera línea
La línea de comando completa termina en p. ej. /tmp/java.26835.cmdline donde 26835 es el PID del script de shell. Creo que también hay un límite de shell en el número de argumentos de la línea de comandos, no puedo recordar, pero posiblemente fueron 64K caracteres.
puede cambiar el script para eliminar el texto de la línea de comando de /tmp/java.PROCESS_ID.cmdline al final
Después de obtener la línea de comandos, siempre muevo el script a algo como "java.script" y copie (cp -a) el binario real java.orig de nuevo a java. Solo uso el script cuando llego al límite de 4K.
Puede haber problemas con los caracteres escapados y tal vez incluso espacios en las rutas o algo así, pero funciona bien para mí.
Puede usar jconsole
para obtener acceso a la línea de comando original sin todos los límites de longitud.
Es posible usar distribuciones de Linux más nuevas, donde se eliminó este límite, por ejemplo RHEL 6.8 o posterior
" El límite de longitud del archivo / proc / pid / cmdline para el comando ps estaba previamente codificado en el núcleo a 4096 caracteres. Esta actualización asegura que la longitud de / proc / pid / cmdline es ilimitada, lo que es especialmente útil para enumerar procesos con argumentos de línea de comando largos. (BZ # 1100069) "
Para los programas basados ??en Java donde solo le interesa inspeccionar los argumentos de la línea de comando que obtuvo su clase principal, puede ejecutar:
jps -m
Estoy bastante seguro de que si realmente está viendo los argumentos truncados en / proc / $ pid / cmdline, en realidad está excediendo la longitud máxima de argumento admitida por el sistema operativo. Por lo que puedo decir, en Linux, el tamaño está limitado al tamaño de la página de memoria. Consulte " ps ww " restricción de longitud para referencia.
La única forma de evitarlo sería recompilar el núcleo. Si está interesado en llegar tan lejos para resolver esto, puede encontrar útil esta publicación: " Lista de argumentos demasiado largo " ;: Más allá de argumentos y limitaciones
Referencia adicional:
ARG_MAX, longitud máxima de argumentos para un nuevo proceso
Quizás el parámetro 'w' para ps es lo que desea. Agregue dos 'w' para una mayor producción. Le dice a ps que ignore el ancho de línea del terminal.