Infrastructure
Instalação da Infraestrutura
Para informações sobre a instalação do cliente, ver “Instalação Cliente”.
Para informações sobre NAT, DHCP e port-forward, ver “NAT com Ubuntu 16.odt”.
Instalação do SO
Crie uma máquina virtual e instale o Ubuntu Server (sem interface gráfica) no modo padrão. Conecte a interface de rede no switch LAN Swtich através da rede LAN.
Configuração do ambiente
Habilite o uso de sudo sem precisar informar a senha. Edite o arquivo de configuração do sudo com o comando abaixo:
$ sudo visudo
e acrescente a seguinte linha no final do arquivo (precisa refazer login):
cliente ALL=(ALL) NOPASSWD: ALL
Atualize o sistema operacional:
$ sudo apt update
$ sudo apt -y upgrade
$ sudo apt -y autoremove
Instale o servidor de SSH através do comando:
$ sudo apt -y install openssh-server
Configure a interface de rede para trabalhar com IP fixo.
Ubuntu 18.04 ou mais recente
Editar o arquivo /etc/netplan/50-cloud-init.yaml com o comando a seguir:
$ sudo cp /etc/netplan/50-cloud-init.yaml{,.velho}
$ sudo vi /etc/netplan/50-cloud-init.yaml
O arquivo deverá se parecer com o texto a seguir:
# This file is generated from information provided by
# the datasource. Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
ethernets:
ens3:
addresses: [172.16.3.202/24]
gateway4: 172.16.3.1
dhcp4: no
nameservers:
addresses: [139.82.16.3, 10.8.0.1]
version: 2
Use o comando a seguir para ativar a configuração:
$ sudo netplan apply
Ubuntu 16.04 ou anteriores
Editar o arquivo /etc/network/interfaces:
$ sudo cp /etc/network/interfaces{,.velho}
$ sudo vi /etc/network/interfaces
Incluir como conteúdo o seguinte texto:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto ens160
iface ens160 inet static
address 172.16.1.202
netmask 255.255.255.0
network 172.16.1.0
broadcast 172.16.1.255
gateway 172.16.1.1
dns-nameservers 139.82.16.3
dns-search inf.puc-rio.br
(TODOS)
Configure o acesso à obaluae.inf.puc-rio.br. Crie a chave de acesso com o comando a seguir aceitando todas as opções:
$ ssh-keygen
$ ssh-copy-id -i .ssh/id_rsa.pub meslin@obaluae.inf.puc-rio.br
Configure o arquivo de hosts. Edite o arquivo /etc/hosts:
$ sudo cp /etc/hosts{,.velho}
$ sudo vi /etc/hosts
Inclua as seguintes linhas:
# Endereços do MUSANet
172.16.1.202 ContextNet1
172.16.2.202 ContextNet2
172.16.3.202 ContextNet3
172.16.4.202 ContextNet4
172.16.0.211 cliente1
172.16.0.212 cliente2
172.16.0.213 cliente3
172.16.0.214 cliente4
Instalação de Java
No momento que esse documento foi gerado, o ContextNet somente era compatível com Java 8 da Oracle. Para instalar o Java 8 da Oracle, utilize os seguintes comandos:
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt install -y oracle-java8-installer
Para configurar a variável de ambiente JAVA_HOME, obtenha o local de instalação do java e depois edite o arquivo de variáveis de ambiente com os seguintes comandos:
$ sudo update-alternatives --config java
There is 1 choice for the alternative java (providing /usr/bin/java).
Selection Path Priority Status
------------------------------------------------------------
0 /usr/lib/jvm/java-8-oracle/jre/bin/java 1081 auto mode
* 1 /usr/lib/jvm/java-8-oracle/jre/bin/java 1081 manual mode
Press <enter> to keep the current choice[*], or type selection number: ^C
$ sudo cp /etc/environment{,.velho}
$ sudo vi /etc/environment
E inclua a seguinte linha ao final do arquivo (verifique a path obtida com o comando anterior):
JAVA_HOME="/usr/lib/jvm/java-8-oracle"
Se você não quiser instalar o Java 8 da Oracle, instale o Java JDK default com o comando a seguir:
$ sudo apt -y install default-jdk
Libere mais portas UDP efêmeras editando o arquivo /etc/sysctl.conf:
$ ulimit -n 65535
$ sudo cp /etc/sysctl.conf{,.velho}
$ sudo vi /etc/sysctl.conf
Inclua as seguintes linhas ao final do arquivo (atenção aos espaços em branco antes e depois do sinal de igual):
net.ipv4.ip_local_port_range = 1025 65000
net.ipv4.tcp_fin_timeout = 1
Depois de reiniciar a máquina, verifique qual a faixa de portas que está disponível com o seguinte comando:
$ sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 1025 65000
Opcionalmente remova o screensaver (tela preta) editando o arquivo grub com o comando a seguir:
$ sudo cp /etc/default/grub{,.velho}
$ sudo vi /etc/default/grub
Modifique a linha com GRUB_CMDLINE_LINUX_DEFAULT="" de acordo com o texto a seguir:
GRUB_CMDLINE_LINUX_DEFAULT="consoleblank=0"
Atualize o grub como seguinte comando:
$ sudo update-grub
Instalação e configuração do ContextNet
Instale o OpenSplice. Instruções mais detalhadas em http://www.lac.inf.puc-rio.br/dokuwiki/doku.php?id=installingdds.
Faça download (ou upload) do arquivo OpenSpliceDDSV6.4.140407OSS-HDE-x86_64.linux-gcc4.6-glibc2.15-installer.tar.gz ou VortexOpenSplice-6.9.181127OSS-HDE-x86_64.linux-gcc5.4.0-glibc2.23-installer.tar.gz.
Descompacte o arquivo, crie o diretório /opt/OpenSplice e copie o diretório HDE para /opt/OpenSplice
$ tar -xvf OpenSpliceDDSV6.4.140407OSS-HDE-x86_64.linux-gcc4.6-glibc2.15-installer.tar.gz
$ tar -xvzf VortexOpenSplice-6.9.181127OSS-HDE-x86_64.linux-gcc5.4.0-glibc2.23-installer.tar.gz
$ sudo mkdir /opt/OpenSplice
$ sudo mv HDE /opt/OpenSplice/
$ sudo mkdir /opt/OpenSplice-69
$ sudo mv HDE/ /opt/OpenSplice-69/
$ sudo ln -s /opt/OpenSplice-69/ /opt/OpenSplice
O resultado será:
$ ls -l /opt/OpenSplice-69/
total 4
drwxrwxr-x 3 contextnet contextnet 4096 Apr 14 2014 HDE
Crie um arquivo vazio chamado opensplice.sh e torne o arquivo executável:
$ sudo vi /etc/profile.d/opensplice.sh
$ sudo chmod +x /etc/profile.d/opensplice.sh
Copie o seguinte conteúdo para dentro do arquivo:
OSPL_HOME=/opt/OpenSplice/HDE/x86_64.linux
PATH=$OSPL_HOME/bin:$PATH
LD_LIBRARY_PATH=$OSPL_HOME/lib${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH
CPATH=$OSPL_HOME/include:$OSPL_HOME/include/sys:${CPATH:=}
OSPL_URI=file://$OSPL_HOME/etc/config/ospl.xml
export OSPL_HOME PATH LD_LIBRARY_PATH CPATH OSPL_TMPL_PATH OSPL_URI
Edite o arquivo /opt/OpenSplice/HDE/x86_64.linux/etc/config/ospl.xml:
$ sudo cp /opt/OpenSplice/HDE/x86_64.linux/etc/config/ospl.xml{,.velho}
$ sudo vi /opt/OpenSplice/HDE/x86_64.linux/etc/config/ospl.xml
Substitua o seu conteúdo pelo texto a seguir. Note que os itens em itálico devem ser modificados de acordo com a máquina onde o OpenSplice está instalado. Os itens sublinhados foram modificados para permitir a descoberta de pares utilizando-se pacotes unicast.
<OpenSplice>
<Domain>
<Name>ospl_sp_ddsi</Name>
<Id>0</Id>
<SingleProcess>true</SingleProcess>
<Service name="ddsi2">
<Command>ddsi2</Command>
</Service>
<Service name="durability">
<Command>durability</Command>
</Service>
<Service enabled="false" name="cmsoap">
<Command>cmsoap</Command>
</Service>
<Listeners>
<StackSize>256000</StackSize>
</Listeners>
</Domain>
<DDSI2Service name="ddsi2">
<General>
<NetworkInterfaceAddress>172.16.1.202</NetworkInterfaceAddress>
<AllowMulticast>false</AllowMulticast>
<EnableMulticastLoopback>false</EnableMulticastLoopback>
<CoexistWithNativeNetworking>false</CoexistWithNativeNetworking>
</General>
<Compatibility>
<!-- see the release notes and/or the OpenSplice configurator on DDSI interoperability -->
<StandardsConformance>lax</StandardsConformance>
<!-- the following one is necessary only for TwinOaks CoreDX DDS compatibility -->
<!-- <ExplicitlyPublishQosSetToDefault>true</ExplicitlyPublishQosSetToDefault> -->
</Compatibility>
<!-- The Discovery section was included by me to allow UNICAST discovery-->
<Discovery>
<Peers>
<Peer address="172.16.1.202"/>
<Peer address="172.16.2.202"/>
<Peer address="172.16.3.202"/>
<Peer address="172.16.4.202"/>
<Peer address="172.16.5.202"/>
<Peer address="172.16.6.202"/>
<Peer address="172.16.7.202"/>
<Peer address="172.16.8.202"/>
<Peer address="172.16.9.202"/>
<Peer address="172.16.10.202"/>
</Peers>
</Discovery>
</DDSI2Service>
<DurabilityService name="durability">
<Network>
<Alignment>
<TimeAlignment>false</TimeAlignment>
<RequestCombinePeriod>
<Initial>2.5</Initial>
<Operational>0.1</Operational>
</RequestCombinePeriod>
</Alignment>
<WaitForAttachment maxWaitCount="10">
<ServiceName>ddsi2</ServiceName>
</WaitForAttachment>
</Network>
<NameSpaces>
<NameSpace name="defaultNamespace">
<Partition>*</Partition>
</NameSpace>
<Policy alignee="Initial" aligner="true" durability="Durable" nameSpace="defaultNamespace"/>
</NameSpaces>
</DurabilityService>
<TunerService name="cmsoap">
<Server>
<PortNr>Auto</PortNr>
</Server>
</TunerService>
</OpenSplice>
Ou então a versão datacenter:
<OpenSplice>
<Domain>
<Name>ospl_sp_ddsi</Name>
<Id>0</Id>
<SingleProcess>true</SingleProcess>
<Service name="ddsi2">
<Command>ddsi2</Command>
</Service>
<Service name="durability">
<Command>durability</Command>
</Service>
<Service enabled="false" name="cmsoap">
<Command>cmsoap</Command>
</Service>
<Listeners>
<StackSize>256000</StackSize>
</Listeners>
</Domain>
<DDSI2Service name="ddsi2">
<General>
<NetworkInterfaceAddress>AUTO</NetworkInterfaceAddress>
<AllowMulticast>true</AllowMulticast>
<EnableMulticastLoopback>true</EnableMulticastLoopback>
<CoexistWithNativeNetworking>false</CoexistWithNativeNetworking>
</General>
<Compatibility>
<!-- see the release notes and/or the OpenSplice configurator on DDSI interoperability -->
<StandardsConformance>lax</StandardsConformance>
<!-- the following one is necessary only for TwinOaks CoreDX DDS compatibility -->
<!-- <ExplicitlyPublishQosSetToDefault>true</ExplicitlyPublishQosSetToDefault> -->
</Compatibility>
</DDSI2Service>
<DurabilityService name="durability">
<Network>
<Alignment>
<TimeAlignment>false</TimeAlignment>
<RequestCombinePeriod>
<Initial>2.5</Initial>
<Operational>0.1</Operational>
</RequestCombinePeriod>
</Alignment>
<WaitForAttachment maxWaitCount="10">
<ServiceName>ddsi2</ServiceName>
</WaitForAttachment>
</Network>
<NameSpaces>
<NameSpace name="defaultNamespace">
<Partition>*</Partition>
</NameSpace>
<Policy alignee="Initial" aligner="true" durability="Durable" nameSpace="defaultNamespace" />
</NameSpaces>
</DurabilityService>
<TunerService name="cmsoap">
<Server>
<PortNr>Auto</PortNr>
</Server>
</TunerService>
</OpenSplice>
IMPORTANTE: o ContextNet v2.5 é compatível somente com o OpenSplice v6.4. Para utilizar o OpenSplice v6.7, é necessário o ContextNet 2.7.
Crie o diretório /opt/ContextNet e copie o ContextNet e o ClientLib para lá com os seguintes comandos:
$ sudo mkdir /opt/ContextNet
$ sudo scp cloud-di@172.16.0.1:Downloads/Contextnet/contextnet-2.5.jar /opt/ContextNet
$ sudo scp cloud-di@172.16.0.1:Downloads/Contextnet/udilib.jar /opt/ContextNet
$ sudo scp cloud-di@172.16.0.1:Downloads/udilib.jar /opt/ContextNet
Resultado:
$ ls -l /opt/
total 8
drwxrwxr-x 2 contextnet contextnet 4096 Apr 15 19:14 ContextNet
drwxr-xr-x 3 root root 4096 Apr 15 18:59 OpenSplice
Opcionalmente, para evitar a mensagem de erro ao iniciar o Gateway do ContextNet, instale a biblioteca SIGAR. Faça upload (ou download) da biblioteca hyperic-sigar-1.6.4.zip ou equivalente para o host a partir de https://sourceforge.net/projects/sigar/files/. Descompacte, mova e muda as permissões com os comandos a seguir (pode ser necessário instalar o unzip):
$ scp cloud-di@172.16.0.1:Downloads/hyperic-sigar-1.6.4.zip .
$ unzip hyperic-sigar-1.6.4.zip
$ sudo mv hyperic-sigar-1.6.4/sigar-bin/lib/*.so /opt/OpenSplice/HDE/x86_64.linux/lib/
$ sudo chmod 775 /opt/OpenSplice/HDE/x86_64.linux/lib/libsigar-*
Instalação do InterSCity
Descrito em https://gitlab.com/smart-city-software-platform/dev-env
Descrito em https://gitlab.com/interscity/interscity-platform/dev-env
Crie o diretório de instalação com o comando a seguir:
$ sudo mkdir /opt/InterSCity
$ cd /opt/InterSCity
Docker
Descrito em https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#install-docker-ce-1
Descrito em em https://docs.docker.com/install/linux/docker-ce/ubuntu/.
Comandos:
$ sudo apt update
$ sudo apt -y upgrade
$ sudo apt -y install linux-image-extra-$(uname -r) linux-image-extra-virtual
$ sudo apt -y install apt-transport-https ca-certificates curl software-properties-common
$ sudo apt -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK
$ sudo apt-key fingerprint 0EBFCD88
pub 4096R/0EBFCD88 2017-02-22
Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid Docker Release (CE deb) <docker@docker.com>
sub 4096R/F273FCD8 2017-02-22
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt update
$ sudo apt -y install docker-ce
$ sudo apt -y install docker-ce docker-ce-cli containerd.io
Para testar a instalação:
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:083de497cff944f969d8499ab94f07134c50bcf5e6b9559b27182d3fa80ce3f7
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://cloud.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
Docker Compose
Descrito em https://docs.docker.com/compose/install/.
$ sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
Para completar o código:
$ sudo curl -L https://raw.githubusercontent.com/docker/compose/1.16.1/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
Para testar a instalação
$ docker-compose --version
docker-compose version 1.16.1, build 1719ceb
InterSCity
Descrito em https://gitlab.com/smart-city-software-platform/dev-env.
Setup:
$ sudo git clone https://gitlab.com/interscity/interscity-platform/dev-env
$ sudo git clone https://gitlab.com/smart-city-software-platform/dev-env
$ cd dev-env
$ sudo git submodule init
$ sudo git submodule update
$ ./project setup
Executar:
$ sudo docker network create platform
34eebf6dfed990e26f5b6f644bcff2f4c774c2e40085c3eae0254cb41fc4cd99
Iniciar o projeto dentro do diretório /opt/InterSCity/dev-env:
$ ./project start
Para testar o projeto, execute o comando a seguir. A resposta deverá ser uma lista de capabilities previamente configurada no InterSCity:
$ curl -X GET "http://localhost:8000/catalog/capabilities"
{"capabilities":[{"id":1,"name":"air-quality","function":0,"description":null},{"id":2,"name":"air-humidity","function":0,"description":null},{"id":3,"name":"parking-occupancy","function":0,"description":null},{"id":4,"name":"video","function":0,"description":null},{"id":5,"name":"queue-length","function":0,"description":null},{"id":6,"name":"semaphore","function":1,"description":null},{"id":7,"name":"illuminate","function":1,"description":null},{"id":8,"name":"parking-type","function":2,"description":null},{"id":9,"name":"current_users","function":0,"description":null},{"id":10,"name":"info_facility_type","function":2,"description":null},{"id":11,"name":"info_total_capacity","function":2,"description":null},{"id":12,"name":"spot_availability","function":0,"description":null},{"id":13,"name":"availability_schedules","function":0,"description":null},{"id":14,"name":"humidity","function":0,"description":null},{"id":15,"name":"temperature","function":0,"description":null},{"id":16,"name":"uv","function":0,"description":null},{"id":17,"name":"pollution","function":0,"description":null},{"id":18,"name":"info_green_percentage","function":2,"description":null},{"id":19,"name":"traffic_speed","function":0,"description":null},{"id":20,"name":"traffic_density","function":0,"description":null},{"id":21,"name":"traffic_light_status","function":1,"description":null},{"id":22,"name":"arduino_traffic_light","function":1,"description":null},{"id":23,"name":"arduino_luminosity","function":1,"description":null},{"id":24,"name":"location","function":0,"description":null}]}
Se, ao testar o projeto, ocorrer um erro com a seguinte mensagem
{"message":"no API found with those values"}
Execute os seguintes passos (ao ser perguntado, confirme positivamente):
$ cd dev-env
$ sudo git pull origin master
$ sudo git submodule foreach git pull origin master
$ cd kong-api-gateway
$ sudo docker exec -it kong /bin/bash
# kong migrations reset
# kong migrations up
# exit
$ cd ..
$ ./project stop
$ ./project start
Para iniciar o projeto automaticamente ao término do boot da máquina, incluir a seguinte linha no final do /etc/rc.local:
( cd /opt/InterSCity/dev-env ; ./project start )
Para executar testes, é necessário instalar os seguintes pacotes e executar o comando:
$ sudo apt -y install moreutils shunit2
$ ./project test
Resource Adaptor
https://social.stoa.usp.br/poo2016/forum-projeto-cidades-inteligentes/resource-adaptor
Executando o MUSANet
Gateway
Executar o gateway:
$ java -jar /opt/ContextNet/contextnet-2.5.jar 192.160.0.12 5500 OpenSplice
Benchmark
Criar o diretório Benchmark
$ mkdir Benchmark
Copiar o Define Group, o arquivo de nomes de coordenadas e as coordenadas para realizar o benchmark:
$ scp 172.16.0.1:Downloads/BenchmarkDefineGroup.jar Benchmark
$ scp 172.16.0.1:Downloads/names.txt Benchmark
$ scp 172.16.0.1:Downloads/RioDeJaneiro-baixo.coordenadas Benchmark
$ scp 172.16.0.1:Downloads/RioDeJaneiro-cima.coordenadas Benchmark
Executar o Group Definer (lembrar de executar o Gateway primeiro):
$ java -jar Benchmark/BenchmarkDefineGroup.jar 192.168.0.12 5500 Benchmark/names.txt 2> erros20180730.txt
ou se for necessário especificar a quantidade de memória:
$ java -Xmx16G -jar Benchmark/BenchmarkDefineGroup.jar 192.168.0.12 5500 Benchmark/names.txt 2> erros20180730.txt
Monitorando a rede
Na VM005, instale o Speedometer
$ sudo apt-get install speedometer
Analise o tráfego através do comando:
$ speedometer -r eth0 -t eth0
Experimento de Throughput
Requerimentos:
Até 10 máquinas virtuais para executar os slices do ContextNet com os endereços IP:
172.16.1.202
172.16.2.202
172.16.3.202
172.16.4.202
172.16.5.202
172.16.6.202
172.16.7.202
172.16.8.202
172.16.9.202
172.16.10.202
Pelo menos 2 máquinas clientes
172.16.0.211
172.16.0.212
InterSCity
ContextNet
OpenSplice
Aplicativo BenchmarkMyCore
Aplicativo BenchmarkOnibusV2
Arquivo com o nome dos arquivos com as áreas
Arquivos com as áreas
Antes de começar a simulação, verificar se o arquivo de configuração do OpenSplice contempla todos os endereços IPs dos slices e se o endereço da interface no arquivo está configurado corretamente. Conferir com o exemplo do arquivo listado anteriormente. Verifique também se as portas estão liberadas com os comandos:
$ sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 1025 65000
$ ulimit -n
Iniciar o InterSCity em ContextNet1:
$ cd /opt/InterSCity/dev-env
$ ./project start
$ curl -X GET "http://localhost:8000/catalog/capabilities"
Iniciar os Gateways em cada um dos slices. Atenção para o endereço IP da interface do Gateway.
$ java -Xmx16G -jar /opt/ContextNet/contextnet-2.5.jar 172.16.1.202 5500 OpenSplice
Working Directory = /home/meslin
Gateway started...
Gateway MR-UDP IP: 172.16.1.202:5500
Iniciar o servidor composto pelo Group Definer e Processing Node. Atenção aos parâmetros:
-a endereço IP do Gateway
-p número da porta UDP do Gateway
-f nome do arquivo com os nomes dos arquivos com as áreas
-i endereço do InterSCity (0.0.0.0 para não usar o InterSCity)
$ java -Xmx16G -jar Benchmark/BenchmarkMyCore.jar -a 172.16.1.202 -p 5500 -f Benchmark/names.txt -i 0.0.0.0
Iniciar os clientes em cada uma das janelas dos clientes com os seguintes parâmetros. Atenção para o endereço IP do Gateway do slice do ContextNet.
-a endereço IP do Gateway do slice do ContextNet
-p número da porta do Gateway do slice do ContextNet
-b número de ônibus
-n quantidade de pacotes a transmitir
-i intervalo entre a criação de cada thread que representa os ônibus
$ java -jar Benchmark/BenchmarkOnibusV2.jar -a 172.16.1.202 -p 5500 -b 125 -n 1000 -i 500
Monitorando um Programa Java
Extraído de https://stackoverflow.com/questions/14715970/jvm-remote-profiling-with-jvisualvm.
You need to start jstatd on the remote machine. For this purpose create a jstatd.all.policy file in the home directory of your remote machine and add the following lines:
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
Then on the command line of your remote machine, you will type (this command must be done as root)
$ jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname={Your remote machine IP address}
Once jstatd service start on the remote machine you basically add the remote connection IP address connection on the JVisualVM UI using add remote host.
The Oracle documents for JVisualVM can be referred at https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/applications_remote.html but it is really confusing to understand jstatd steps.
Inclua os seguintes parâmetros ao executar a JVM (isso realmente é necessário? R.: NÃO!):
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9990
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Programas de Monitoramento
Local
top
vmstat
mpstat
sar
Remote
Glance (glance -w)
Instalação das Ferramentas de Apoio
tc - Traffic Control
This tool shows and manipulates traffic control settings.
To install on Ubuntu (20.04):
$ sudo apt install iproute2
jvisualvm - Java VisualVM
The JVisualVM is part of Oracle JDK (not OpenJDK). It is located at jdk1.8.0_281/bin, the Java bin directory (the exact name depends on the Java version).
Oracle discontinued the JVisualVM on JDK 9. VisualVM replaces JVisualVM in JDK 9 and later.
From JVisualVM website: VisualVM is a visual tool integrating command line JDK tools and lightweight profiling capabilities. Designed for both development and production time use.
To install on Ubuntu (20.04):
$ wget https://github.com/oracle/visualvm/releases/download/2.0.6/visualvm_206.zip
$ unzip visualvm_206.zip
The Java VisualVM executable file is visualvm_206/bin/visualvm (or visualvm_206/bin/visualvm.exe on Windows)
More information at:
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jvisualvm.html
https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/applications_remote.html
sar - Collect, report, or save system activity information
The sar command is installed by default in most Linux flavors, but if you need to install it manually, use the following command:
$ sudo apt install sysstat
If you get the following error, you need to enable system monitoring:
$ sar
Cannot open /var/log/sysstat/sa29: No such file or directory
Please check if data collecting is enabled
To enable system monitoring, please, edit the /etc/default/sysstat file and change ENABLED="false" to ENABLED="true". The following lines show the resulting file:
#
# Default settings for /etc/init.d/sysstat, /etc/cron.d/sysstat
# and /etc/cron.daily/sysstat files
#
# Should sadc collect system activity informations? Valid values
# are "true" and "false". Please do not put other values, they
# will be overwritten by debconf!
ENABLED="true"
Then, restart the service:
$ sudo service sysstat restart