Op het werk ben ik bezig geweest met het performance testen van mijn applicatie. Hierbij hadden we helaas te maken met een load balancer die op basis van het source IP adres routeert. We moesten dus meerdere IP's aliasen. Lang verhaal kort, JMeter ondersteunde dit niet, tenzij je meerdere processen draait en ieder proces aan een IP adres bind met een opstartparameter. Meerdere JMeter instanties dus.
Dit stond me niet aan dus ik ben nu thuis aan het proberen om hiervoor een fix in JMeter in te bouwen. Die fix is qua JMeter code geen probleem, maar ik loop tegen het probleem aan dat ik niet meerdere IP's kan aliasen op mijn thuisnetwerk.
Om eventuele problemen uit te sluiten heb ik het volgende testprogrammaatje geschreven:
50 is een IP alias die ik in Vista heb ingesteld. Ik heb een range van IP aliases opgegeven, vanaf 192.168.1.50 t/m 192.168.1.59.
Als ik bovenstaand programmaatje draai, krijg ik de volgende output:
Ik vind het nogal een vreemde foutmelding en hij vertelt me ook niet echt wat er nu precies mis is. Als ik het programma aanpas zodat ik een compleet ongeldig IP gebruik, zoals 192.168.1.60, dan krijg ik een JVM_BIND exception, dus niet de bovenstaande stack trace.
Als ik 127.0.0.1 opgeef als local address, dan kan ik wel gewoon www.google.nl opvragen. Dan krijg ik netjes een HTTP 200 code terug.
Van Google, StackOverflow, etc word ik niet veel wijzer. De enige twee conclusies die ik momenteel kan trekken, zijn dat de Java code op zich correct is (met 127.0.0.1 werkt het) en dat het koppelen aan een IP alias in principe ook goed gaat (bij ongeldige alias krijg ik een JVM_BIND exception). Maar daarna is het voor mij één grote mist...
Over mijn configuratie:
Ik draai Vista 64bit met JDK 1.6.0_14 vanuit IntelliJ IDEA. 9.
Mijn router is vrij standaard geconfigureerd, dus met DHCP aan. DHCP uitzetten leverde niets op...
Dit is mijn (onboard) netwerkkaart: Realtek RTL8168/8111 Family PCI-E Gigabit Ethernet NIC (NDIS 6.0)
Iemand een idee waarom het niet werkt?
Dit stond me niet aan dus ik ben nu thuis aan het proberen om hiervoor een fix in JMeter in te bouwen. Die fix is qua JMeter code geen probleem, maar ik loop tegen het probleem aan dat ik niet meerdere IP's kan aliasen op mijn thuisnetwerk.
Om eventuele problemen uit te sluiten heb ik het volgende testprogrammaatje geschreven:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HostConfiguration; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.GetMethod; import java.io.IOException; import java.net.Inet4Address; import java.net.InetAddress; import java.util.Arrays; public class Test { public static void main(String[] args) throws IOException { GetMethod getMethod = new GetMethod("http://www.google.nl"); HttpClient httpClient = new HttpClient(); HostConfiguration hc = new HostConfiguration(); InetAddress inetAddress = Inet4Address.getByName("192.168.1.50"); System.out.println("inetAddress = " + inetAddress); hc.setLocalAddress(inetAddress); httpClient.setHostConfiguration(hc); int code = httpClient.executeMethod(getMethod); System.out.println("code = " + code); } } |
50 is een IP alias die ik in Vista heb ingesteld. Ik heb een range van IP aliases opgegeven, vanaf 192.168.1.50 t/m 192.168.1.59.
Als ik bovenstaand programmaatje draai, krijg ik de volgende output:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| inetAddress = /192.168.1.50 3-jan-2010 15:50:07 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry INFO: I/O exception (java.net.ConnectException) caught when processing request: connect: Address is invalid on local machine, or port is not valid on remote machine 3-jan-2010 15:50:07 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry INFO: Retrying request 3-jan-2010 15:50:07 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry INFO: I/O exception (java.net.ConnectException) caught when processing request: connect: Address is invalid on local machine, or port is not valid on remote machine 3-jan-2010 15:50:07 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry INFO: Retrying request 3-jan-2010 15:50:07 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry INFO: I/O exception (java.net.ConnectException) caught when processing request: connect: Address is invalid on local machine, or port is not valid on remote machine 3-jan-2010 15:50:07 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry INFO: Retrying request Exception in thread "main" java.net.ConnectException: connect: Address is invalid on local machine, or port is not valid on remote machine at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:519) at java.net.Socket.connect(Socket.java:469) at java.net.Socket.<init>(Socket.java:366) at java.net.Socket.<init>(Socket.java:240) at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:79) at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:121) at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:706) at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:386) at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170) at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396) at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324) at Test.main(Test.java:27) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:110) Process finished with exit code 1 |
Ik vind het nogal een vreemde foutmelding en hij vertelt me ook niet echt wat er nu precies mis is. Als ik het programma aanpas zodat ik een compleet ongeldig IP gebruik, zoals 192.168.1.60, dan krijg ik een JVM_BIND exception, dus niet de bovenstaande stack trace.
Als ik 127.0.0.1 opgeef als local address, dan kan ik wel gewoon www.google.nl opvragen. Dan krijg ik netjes een HTTP 200 code terug.
Van Google, StackOverflow, etc word ik niet veel wijzer. De enige twee conclusies die ik momenteel kan trekken, zijn dat de Java code op zich correct is (met 127.0.0.1 werkt het) en dat het koppelen aan een IP alias in principe ook goed gaat (bij ongeldige alias krijg ik een JVM_BIND exception). Maar daarna is het voor mij één grote mist...
Over mijn configuratie:
Ik draai Vista 64bit met JDK 1.6.0_14 vanuit IntelliJ IDEA. 9.
Mijn router is vrij standaard geconfigureerd, dus met DHCP aan. DHCP uitzetten leverde niets op...
Dit is mijn (onboard) netwerkkaart: Realtek RTL8168/8111 Family PCI-E Gigabit Ethernet NIC (NDIS 6.0)
Iemand een idee waarom het niet werkt?
Fat Pizza's pizza, they are big and they are cheezy