Cómo mejorar las métricas de rendimiento del sistemaPrefacio Cuando escribí este título, me sorprendió haber creado un título tan grande. ¡Me di cuenta de que este es el escenario de la vida de innumerables personas! No quiero explicar todos los aspectos de la mejora del rendimiento del sistema. Solo quiero hablar sobre algunas de nuestras ideas y soluciones de diseño para mejorar el rendimiento del sistema J2EE durante el proceso de migración del sistema en función de casos específicos, principalmente la aplicación de la tecnología de almacenamiento en caché de datos. Espero que no dé. Todos han traído demasiados malentendidos. Nota: Todas las discusiones en este artículo se basan en la plataforma Windows y en otras plataformas convencionales, como Unix, Linux, etc. También existe un mecanismo de implementación similar al MMF, que no entraré en detalles aquí. Volver al inicio Concepto: ¿Qué es MMF? (1) A partir de ahora, el término FMM aparecerá con frecuencia en este artículo. Entonces comenzaré con una breve introducción a MMF. MMF, el nombre completo es Archivos asignados en memoria. Desde una perspectiva macro, es una tecnología de mapeo de memoria de datos o una forma de administrar la memoria dinámica. Randy Kath define MMF de la siguiente manera: Los archivos asignados en memoria (MMF) proporcionan una función de administración de memoria única. permite que las aplicaciones accedan a archivos en el disco de la misma manera que la memoria dinámica: a través de punteros. Desde una perspectiva micro, tiene las siguientes características principales: Concepto: MMF es un objeto de Windows al que se puede crear y acceder a través de la API de Windows. Naturaleza: Puede considerar un MMF como un archivo normal, excepto que está almacenado en la memoria del sistema. Figura 1: MMF se puede habilitar en todos los procesos (extraído de MSDN Online) Características: Cualquier proceso puede acceder a MMF: cualquier proceso o subproceso puede acceder a MMF, lo que significa que MMF tiene la característica de habilitarse en todos los procesos, y esta es su mayor "encanto". Por supuesto, dado que todas las operaciones de acceso se realizan en la memoria, también se caracteriza por su alta velocidad. Principio de implementación: MMF se basa en la tecnología de memoria virtual comúnmente utilizada en los sistemas operativos modernos, que se basa en un mecanismo llamado paginación (2). Por lo tanto, se puede considerar que siempre que el sistema operativo adopte un sistema de gestión de memoria virtual basado en páginas, se puede realizar la función MMF. Duración: MMF existe hasta que se desconecta la última referencia. MMF es en realidad una función básica de la plataforma Windows y todas las operaciones en ella se pueden realizar a través de la API de Windows, lo que hace posible que COM acceda a datos a través de procesos bajo la arquitectura DNA. Hace posible almacenar en caché los datos comerciales en el lado de la base de datos en MMF en el lado del servidor de aplicaciones o en el cliente, lo que elimina la sobrecarga del acceso frecuente a la base de datos y mejora en gran medida el rendimiento del acceso al sistema. En Java, también encontramos una serie de clases que aprovechan MMF bajo la especificación NIO de Jdk1.4. Aunque la documentación API de Jdk1.4 no propone claramente tal concepto, sabemos por la documentación de FileChannel y ByteBuffer que el objeto FileChannel tiene la función de asignar archivos a la memoria. Como podemos ver arriba, esto en realidad crea un MMF. Volver arriba Antecedentes: ¿Qué problema encontramos? Queremos actualizar el sistema que hemos adquirido, lo que naturalmente implica la elección de la plataforma. El sistema original se basó en la arquitectura DNA de Microsoft y ahora tendemos a trasladarlo a la plataforma J2EE. Antes de eso, naturalmente, tendremos que realizar los análisis de viabilidad necesarios. Entre otras consideraciones, nos centramos principalmente en la viabilidad de tecnologías clave, ya que queríamos maximizar el uso del diseño arquitectónico del sistema original. Dado que el sistema se basa en la arquitectura DNA de Microsoft y utiliza el componente de acceso remoto DCOM, el rendimiento del sistema naturalmente se convierte en una consideración muy importante. Por lo tanto, lo más destacado del sistema original es que se ha trabajado mucho para mejorar los indicadores de rendimiento de todo el sistema, de modo que todo el sistema tenga un rendimiento sobresaliente en términos de velocidad de respuesta del sistema y operaciones concurrentes de gran volumen de datos.
Entre ellos, la aplicación de la tecnología de almacenamiento en caché de datos MMF es la más crítica. A través del almacenamiento en caché de datos en el servidor y el cliente, se mejora efectivamente el rendimiento de todo el sistema. Figura 2: Diagrama del sistema después de aplicar MMF. Descripción del diagrama: La parte "caché del servidor (reglas comerciales)" del diagrama es la caché de datos que usa MMF. Además, el cliente también usa MMF ampliamente, pero no está marcado en el diagrama; . La idea de usar MMF en todo el sistema es: cada vez que se inicia el sistema, el programa accederá a la base de datos, obtendrá los datos en la tabla y los almacenará en caché en el MMF en el servidor de aplicaciones a través de una serie de pasos, como mostrado por la línea negra en la siguiente figura. Cada vez que el cliente solicite datos en el futuro, accederá directamente al MMF en el servidor de aplicaciones (como se muestra en la línea roja en la figura) y almacenará en caché los datos en el cliente al mismo tiempo. Por supuesto, también se combina con un mecanismo de comparación de datos de tiempo razonable. Figura 3: Interacción entre el sistema y MMF Estos son los mecanismos de almacenamiento en caché de MMF que queremos implementar. En pocas palabras, estamos intentando encontrar una solución de mecanismo de almacenamiento en caché correspondiente en Java. Volver al principio Solución: ¿En qué se nos ocurrió? Con un objetivo claro en mente, emprendemos un viaje para encontrar soluciones Java. Encontramos casi todas las soluciones posibles y aquí hay algunos resúmenes de lo que exploramos y pensamos. En primer lugar, lo primero que pensamos es utilizar JNI (Java Native Interface, interfaz nativa de Java). Después de todo, esta es la solución más intuitiva y sin problemas. Con JNI, puede llamar directamente al código VC o VB existente en Java sin tener que reescribir el código, lo que ahorra tiempo y la eficiencia de ejecución del programa es bastante buena. Sin embargo, también existen muchos problemas con el uso de JNI: la compatibilidad y coordinación entre diferentes códigos de programa son difíciles de mantener. En resumen, este tipo de arroz relleno se puede utilizar como recurso temporal y se puede considerar cuando el tiempo del proyecto es escaso, pero no debe considerarse a largo plazo. (3) En segundo lugar, también pensamos en usar XML. XML es una tecnología muy popular y práctica. Jdk1.4 proporciona un conjunto completo de API XML, lo que hace que sea muy fácil generar y analizar archivos XML. Sin embargo, personalmente creo que la mayor ventaja de XML es que proporciona un formato común para el intercambio de datos entre diferentes sistemas. En términos de almacenamiento, análisis y conversión de datos, no es imposible como candidato para el almacenamiento en caché de datos, pero desde la perspectiva. de optimizar el sistema Desde la perspectiva del rendimiento y la herencia total de la arquitectura original del sistema, no es la solución óptima. 3. Utilice MMF Debido a que el sistema original utiliza MMF, naturalmente pensamos si existe MMF en JAVA. Después de una cuidadosa investigación en Jdk1.4, encontramos con éxito la función que esperábamos. Después de muchas discusiones, decidimos adoptar esta tecnología en el nuevo sistema. Volver al principio Solución: ¿Qué hicimos? Después de tomar la decisión, debemos realizar un estudio detallado de MMF en Java. En Jdk 1.4, la interfaz de programación de aplicaciones de MMF se encuentra principalmente en los paquetes java.nio y java.nio.channels. En el nuevo JAVA NIO, se enfatizan los dos conceptos de Buffer y Channel, y en realidad se propone MMF como un anexo de estos dos conceptos. El método de mapa de la clase FileChannel completa la función de "asignar directamente un área del archivo de canal a la memoria" y devuelve un objeto MappedByteBuffer. Se puede ver que en Jdk1.4, MMF se representa en forma de la clase MappedByteBuffer y su clase principal, los objetos MMF ByteBuffer se pueden manipular a través de algunos métodos proporcionados por estas clases, y la función de crear MMF la completa principalmente. Clase de canal de archivos.