Mejora del rendimiento con correlaciones de matriz de bytes

Puede almacenar valores en las correlaciones en una matriz de bytes en lugar de hacerlo en formato POJO, lo que reduce la huella en la memoria que puede consumir un gráfico grande de objetos.

Ventajas

La cantidad de memoria que se consume aumenta con el número de objetos de una gráfico de objetos. Reduciendo un gráfico complicado de objetos a una matriz de bytes, sólo se conserva un objeto en el almacenamiento dinámico, en lugar de varios objetos. Con esta reducción del número de objetos en el almacenamiento dinámico, el tiempo de ejecución Java tiene menos objetos para buscar durante la recogida de basura.

El mecanismo de copia predeterminado utilizado por WebSphere eXtreme Scale es la serialización, que es un mecanismo caro. Por ejemplo, si utiliza la modalidad de copia predeterminada de COPY_ON_READ_AND_COMMIT, se realiza una copia tanto en el momento de leer, como en el de obtener. En lugar de realizar una copia durante la lectura, con las matrices de bytes, el valor se infla a partir de los bytes y, en lugar de realizar una copia durante la confirmación, el valor se serializa en bytes. El uso de matrices de bytes genera una coherencia de datos equivalentes al valor predeterminado con una reducción de la memoria utilizada.

Si se utilizan las matrices de bytes, tenga en cuenta que tener un mecanismo de serialización optimizado es vital para ver una reducción en el consumo de memoria. Para obtener más información, consulte Ajuste del rendimiento de serialización.

Configuración de correlaciones de matrices de bytes

Puede habilitar las correlaciones de matrices de bytes con el archivo XML ObjectGrid modificando el atributo CopyMode utilizado por una correlación por el valor COPY_TO_BYTES, mostrado en el ejemplo siguiente:

<backingMap name="byteMap" copyMode="COPY_TO_BYTES" />

Consideraciones

Debe considerar si va a utilizar o no las correlaciones de matrices de bytes en un escenario determinado. Aunque puede reducir el uso de la memoria, el uso del procesador puede aumentar cuando se utilizan las matrices de bytes.

La lista siguiente describe varios factores que se deben tener en cuenta antes de elegir utilizar la función de correlación de matrices de bytes.

Tipo de objeto

Comparativamente, la reducción de la memoria no es posible si se utilizan las correlaciones de matrices de bytes para algunos tipos de objeto. Por consecuencia, existen varios tipos de objeto para los que no deberá utilizar las correlaciones de matrices de bytes. Si utiliza algunos de los derivadores primitivos de Java como valores, o un POJO que no contiene referencias a ningún otro objeto (sólo almacenar campos primitivos), el número de objetos Java ya es tan bajo como sea posible, sólo hay uno. Puesto que la cantidad de memoria utilizada por el objeto ya se ha optimizado, no se recomienda el uso de una correlación de matrices de bytes para estos tipos de objetos. Las correlaciones de matrices de bytes son más idóneas para los tipos de objeto que contiene otros objetos o colecciones de objetos donde el número total de objetos POJO es mayor que uno.

Por ejemplo, si tiene un objeto Customer (Cliente) que tenía una dirección empresarial y una dirección personal, así como una colección de Orders (Pedidos), el número de objetos en el almacenamiento dinámico y el número de bytes utilizados por dichos objetos se pueden reducir mediante el uso de correlaciones de matrices de bytes.

Acceso local

Cuando se utilizan otras modalidades de copia, las aplicaciones se pueden optimizar, cuando las copias se realizan, si los objetos son Cloneable con el ObjectTransformer predeterminado o cuando se proporciona un ObjectTransformer personalizado con un método copyValue optimizado. En comparación con otras modalidades de copia, la copia en operaciones de lecturas, escrituras o confirmación tendrá un coste adicional al acceder a los objetos de forma local. Por ejemplo, si tiene una memoria caché cercana en una topología distribuida o al acceder directamente a una instancia de ObjectGrid de servidor o local, el tiempo de acceso y confirmación se aumentará si se utilizan las correlaciones de matrices de bytes debido al coste de serialización. Verá un coste similar en una topología distribuida, si utiliza los agentes de cuadrícula de datos o si accede al primario del servidor, al utilizar el plug-in ObjectGridEventGroup.ShardEvents.

Interacciones de plug-in

Con las correlaciones de matrices de bytes, los objetos no se inflan cuando se establece una comunicación entre un cliente y un servidor, a menos que el servidor necesite un formato POJO. Los plug-ins que interactúan con el valor de correlación experimentará una reducción en el rendimiento debido a la necesidad de inflar el valor.

Cualquier plug-in que utiliza LogElement.getCacheEntry o LogElement.getCurrentValue verá este coste adicional. Si desea obtener la clave, podrá utilizar LogElement.getKey, que impide la sobrecarga adicional asociada al método LogElement.getCacheEntry().getKey. En las siguientes secciones se tratan los plug-ins para clarificar el uso de las matrices de bytes.

Índices y consultas

Cuando los objetos se almacenan en el formato POJO, el coste de los índices y las consultas es mínimo, porque el objeto no necesita ser inflado. Cuando se utiliza una correlación de matrices de bytes tendrá el coste adicional de inflar el objeto. En general, si la aplicación utiliza índices o consultas, no se recomienda utilizar las correlaciones de matrices de bytes, a menos que sólo ejecute consultas sobre atributos de clave.

Bloqueo optimista

Si se utiliza la estrategia de bloqueo optimista, tendrá el coste adicional durante las actualizaciones y las operaciones invalidar. Esto procede de tener que inflar el valor en el servidor para obtener el valor de la versión para realizar una comprobación de colisión optimista. Si simplemente utiliza el bloqueo optimista para garantizar las operaciones de obtención de información y no necesita una comprobación de colisión optimista, puede utilizar com.ibm.websphere.objectgrid.plugins.builtins.NoVersioningOptimisticCallback para inhabilitar la comprobación de versiones.

Cargador

Con un cargador, también tendrá el coste en el tiempo de ejecución de eXtreme Scale de inflar y serializar el valor si es utilizado por el cargador. Puede seguir utilizando las correlaciones de matrices de bytes con los cargadores, pero tenga en cuenta el coste de realizar cambios en el valor en dicho escenario. Por ejemplo, puede utilizar la característica de matriz de bytes en el contexto de una memoria caché que se lee con frecuencia. En este caso, la ventaja de tener menos objetos en el almacenamiento dinámico y utilizar menos memoria superará el coste generado del uso de las matrices de bytes en las operaciones insertar y actualizar.

ObjectGridEventListener

Cuando se utiliza el método transactionEnd en el plug-in ObjectGridEventListener, tendrá un coste adicional en el lado del servidor para las solicitudes remotas al acceder a una CacheEntry del LogElement o al valor actual. Si la implementación del método no accede a estos campos, no tendrá el coste adicional.