27 June 2018

NGINX include statement

Este post es solo para demostrar la potencia de la sentencia include en NGINX. Con esta instruccion podremos evitar crear configuraciones gigantescas en un solo fichero de texto, pudiendo distribuir dichas configuraciones en ficheros especializados.

En el siguiente ejemplo vamos a iniciar un microservicio en el puerto 9090, posteriormente vamos a dar acceso a este servicio por el puerto 80 a travez de diferentes "context path" (/camel1 y /camel2) distribuidos en diferentes ficheros.

Iniciamos un servicio de prueba en el puerto 9090 ( para mas info visite helloworld-camel-spring-boot)
$ docker run -d -p 9090:8080 helloworld-camel-spring-boot:0.0.2 
Registramos la configuracion principal en NGINX importando los ficheros *.location (mappings) por cada "context path" al cual vamos a dar servicio.

camel.conf file
upstream camelcluster {
  keepalive 32; # keepalive connections
  server localhost:9090; #camel miroservice ip and port
}

server { # simple load balancing
    listen          80;
    server_name     localhost;
    access_log      /var/log/nginx/camel.server.access.log;
    error_log       /var/log/nginx/camel.server.error.log;

    include /etc/nginx/conf.d/*.location;
}
Primer mapping (camel1.location file)
location /camel1 {
      sendfile off;

      proxy_set_header   Host              $host;
      proxy_set_header   X-Real-IP         $remote_addr;
      proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
      proxy_set_header   X-Forwarded-Proto $scheme;
      proxy_set_header   Connection        ""; # Clear for keepalive

      proxy_connect_timeout      90;
      proxy_send_timeout         90;
      proxy_read_timeout         90;
      proxy_buffering            off;
      
      proxy_http_version 1.1;
      proxy_pass         http://camelcluster/camel/say/helloObject/ExampleNumberOne;
      
}
Segundo mapping (camel2.location file)
location /camel2 {
      sendfile off;

      proxy_set_header   Host              $host;
      proxy_set_header   X-Real-IP         $remote_addr;
      proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
      proxy_set_header   X-Forwarded-Proto $scheme;
      proxy_set_header   Connection        ""; # Clear for keepalive

      proxy_connect_timeout      90;
      proxy_send_timeout         90;
      proxy_read_timeout         90;
      proxy_buffering            off;
      
      proxy_http_version 1.1;
      proxy_pass         http://camelcluster/camel/say/helloObject/ExampleNumber2;
      
}
Reiniciamos NGINX.
$ sudo systemctl restart nginx
Comprobaremos que los mappings funcionan ejecutando curl commands como los siguientes:
$ curl http://localhost/camel1
{"text":"Hello ExampleNumberOne, I'm SpringCamelContext(camel-1) with spring id application!"}

$ curl http://localhost/camel2
{"text":"Hello ExampleNumber2, I'm SpringCamelContext(camel-1) with spring id application!"}

- Enjoy it -

07 March 2018

Cuanta RAM ocupa un proceso Java

Algunas veces no sabemos que responder cuando nos preguntan cuanta RAM ocupa un proceso Java (por ejemplo una instancia de un microservice) en linux (en este caso CentOS) y solo disponemos de la linea de comandos, aqui os dejo un ejemplo de la sequencia de comandos a ejecutar para averiguar eso.

Lo primero que debemos averiguar es el PID de nuestro proceso java.
[developer@localhost ~]$ ps -C java -o pid,%cpu,%mem,cmd
  PID %CPU %MEM CMD
 3435  1.5 22.0 /usr/bin/java  ...
 4302  0.1  3.5 /opt/jdk1.8.0_121/bin/java ...
Una vez obtenido el PID, por ejemplo 3435, preguntamos por la memoria usada actualmente.
[developer@localhost ~]$ cat /proc/3435/status | grep VmRSS | awk '{print $2}'
856380
Luego podemos averiguar cuanta memoria hay en nuestro sistema.
[developer@localhost ~]$ cat /proc/meminfo | grep MemTotal | awk '{print $2}'
3882124
Ahora bien, si sacais la regla de 3 simple os dareis cuenta que el proceso 3435 ocupa el 22% de la memoria, lo cual coincide con el porcentaje obtenido en la primera sentencia ejecutada.

Tip:
Se puede obtener toda la información del proceso "in one go" simplemente especificando rss como una de las opciones cuando ejecutamos ps.
[developer@localhost ~]$ ps -C java -o pid,%cpu,%mem,rss,cmd
VmRSS a efectos prácticos es la cantidad de memoria RAM que el proceso Java ocupa en el sistema operativo. Aunque si bien no quiere decir que sea la cantidad de memoria que el proceso java esta utilizando en ese momento, de alli las diferencias cuando se monitoriza la "Java Heap Space".

Enlaces relacionados:
  • https://dzone.com/articles/spring-boot-memory-performance
  • https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used

-FIN-