Pregunta

Cuando sabe que su software (no es un controlador, no es parte del sistema operativo, solo una aplicación) se ejecutará principalmente en un entorno virtualizado, ¿existen estrategias para optimizar su código y / o la configuración del compilador? ¿O alguna guía sobre lo que debes y no debes hacer?

No se trata de una ganancia de rendimiento de 0.0x%, pero tal vez, solo tal vez haya cosas simples que mejorarán drásticamente el rendimiento o cosas que parecen simples pero que se sabe que son desastrosas en entornos virtualizados. Por ejemplo, habilitar CONFIG_PARAVIRT en una compilación del núcleo se realiza fácilmente y puede aumentar mucho el rendimiento. Ahora estoy buscando cosas similares para aplicaciones, si las hay.

En mi caso, será el código C ++ y probablemente VMWare, pero quiero mantener la pregunta tan indistinta como idioma / producto como sea posible. Me pregunto si existen estrategias de este tipo o si esto supondría una pérdida total de tiempo. Después de todo, el concepto de virtualización es que no tiene que preocuparse demasiado por ello.

¿Fue útil?

Solución

El único consejo que puedo darte es el uso cuidadoso de mlock () / mlockall () ... mientras buscas controladores de globos con errores.

Por ejemplo, si un huésped Xen se inicia con 1 GB, luego se reduce a 512 MB, es muy típico que el dominio privilegiado NO mire la cantidad de memoria que el kernel paravirtualizado realmente prometía a los procesos (es decir, Committed_AS). En realidad, con Xen, a menos que este valor se coloque en Xenbus, el host privilegiado no tiene idea de lo que hará ese globo. Creo que esto también coincide con KVM, dependiendo de cómo esté configurado el kernel ... pero su pregunta supone que no sabemos nada de esas cosas :)

Por lo tanto, proteja las cosas (tenga cuidado, pero sea prudente) que simplemente no se pueden localizar, siempre tenga en cuenta el escenario 'cielo está cayendo'.

Del mismo modo, el uso de posix_fadvise () / posix_madvise () para decirle al kernel PV cuánto necesita o no necesita almacenamiento en búfer es siempre una buena idea.

Más allá de eso, puede hacer muy poco ... ya que solo está hablando con el núcleo paravirtualizado, que está diseñado para hacer que los procesos sean ajenos a la virtualización en primer lugar.

No uso mucho KVM (todavía), aunque planeo explorarlo más en el futuro. Sin embargo, el 90% de las cosas que he estado escribiendo últimamente está específicamente diseñado para ejecutarse en invitados Xen paravirtualizados. Siento estar un poco centrado en Xen / C, pero ahí es donde está mi experiencia y pv_ops está en la línea principal (pronto también estará disponible en xen-0) :)

Buena pregunta, por cierto :)

Edición :

Cuando dije 'cuidadoso pero prudente', me refería a un paso por encima de conservador. Si su programa asigna alguna estructura de trabajo que la mayoría de las funciones necesitan, bloquéela. Si asigna búferes para leer archivos grandes, no los bloquee ... y asegúrese de llamar a posix_fadvise () para que el kernel sepa que solo desea acceder a él una vez (si ese es el caso). Además, asegúrese de informar al núcleo sobre el uso de los archivos asignados en la memoria, especialmente si sirven para organizar la concurrencia.

En resumen, ayude a su kernel host a administrar la memoria, no permita que los bloques asignados críticos se conviertan en paginación sucia, no asuma que su programa es más importante que cualquier otra cosa al bloquear todo lo que asigna :)

Perdón por la ambigüedad. La mejor frase que se me ocurrió fue "cuidadoso, pero prudente".

Otros consejos

He descubierto que se trata de E / S.

Las máquinas virtuales suelen ser muy malas en IO. Esto hace que varias cosas sean mucho peores de lo que serían en estaño real.

El intercambio es especialmente dañino: destruye completamente el rendimiento de las máquinas virtuales, aunque sea un poco, ya que IO es muy lento.

La mayoría de las implementaciones tienen una gran cantidad de contención de IO entre máquinas virtuales, no he visto una que evite esto o lo maneje con sensatez.

Si puedes, usa un ramdisc para archivos temporales, pero no hagas que se intercambie, porque eso sería aún peor.

Mi único consejo es mantener su memoria y uso de IO bajo si es posible.

IO en una VM es bastante lento en comparación con el hardware físico. Si puede evitar hacerlo, evítelo.

Las cosas que son lentas en el hardware real son aún más lentas cuando el sistema está virtualizado. Depende de la tecnología de virtualización utilizada cuánto más lento se vuelven.

Evite especialmente cualquier cosa que requiera E / S con el mundo fuera del entorno virtual. Dependiendo de cómo se configuran las cosas, esto incluye el dibujo en la pantalla, el intercambio y las E / S de disco y red. Eso es más o menos en un orden decreciente de importancia.

Si es posible, imagina que estás escribiendo para una computadora de diez años. Si su aplicación funcionaría en una PC de escritorio o computadora portátil de 1999, debería funcionar bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top