Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bzm - http2 sampler number of connections #50

Open
heysarthak opened this issue Jun 6, 2023 · 6 comments
Open

bzm - http2 sampler number of connections #50

heysarthak opened this issue Jun 6, 2023 · 6 comments

Comments

@heysarthak
Copy link

Hi,

I was using http2 sampler 2.0.2, in which i am not able to control number of connections made with the server. if the number of threads are decreased, connections are decreased. But so does the performance of load testing.
is there a way to make controlled number of connections with the server per sampler.
i checked 2.0.2-alpha-3 release, it is not well documented yet so cannot find my use case over there.

@3dgiordano
Copy link
Contributor

Hi @heysarthak

Each thread has its own http client and each http client manages connections according to the http specification.

When each thread terminates, it sends that thread's client to recycle, thereby closing connections that will not be used again.
Connections are also recycled based on whether the server sent them to shut down or if their idle timeout expires.

The http2 plugin supports multiplexing, so multiple requests can be sent on the same connection as opposed to how JMeter's http1 implements it, where for each request it uses a different connection.

To allow requests to run in parallel, you must group them in a new controller element "HTTP2 Controller" available in the alpha version. The requests that are incorporated there will run in parallel and take advantage of the multiplexing benefit.
Otherwise they will run in sequence (as JMeter's HTTP1 does), but reusing the connections that have not been invalidated by the server or by the idle timeout.

There are multiple properties that allow you to adjust the configuration of the http client, but we need to know exactly what you mean by connections in order to see which case should be adjusted.

It would be convenient for you to explain a little more in detail about the problem you are detecting.
You can use a proxy like Charles proxy to capture and share connection information to us as well as what you would expect.
You can show us the same flow or cycle in a real browser to compare behaviors.

Regards
David

@heysarthak
Copy link
Author

I am currently running the whole setup on cloud based infra with Kubernetes,
Avg load on server is around 115,000 transactions per second.

on running the sample request, i can find the total number of connections to 20 nodes on which the server pods are deployed are around 1400+
The command i am using to get the number of ports linked is

ps -aef |grep 'java' |grep '-router'|awk '{print "sudo nsenter -t " $2 " -n netstat -nap | grep :8080"}'|sh | awk '{print $4}'|grep '8080'|wc -l

i did try changing httpJettyClient.minThreads to 30 or 50, but anyhow i was facing this error.

2023-06-06 13:00:35,693 ERROR o.a.j.s.BatchSampleSender: sampleOccurred
java.rmi.ConnectException: Connection refused to host: ; nested exception is:
java.net.ConnectException: Connection refused
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:626) ~[?:?]
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:217) ~[?:?]
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:204) ~[?:?]
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:133) ~[?:?]
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:215) ~[?:?]
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:160) ~[?:?]
at jdk.proxy2.$Proxy19.processBatch(Unknown Source) ~[?:?]
at org.apache.jmeter.samplers.BatchSampleSender.sampleOccurred(BatchSampleSender.java:182) ~[ApacheJMeter_core.jar:5.5]
at org.apache.jmeter.samplers.DataStrippingSampleSender.sampleOccurred(DataStrippingSampleSender.java:106) ~[ApacheJMeter_core.jar:5.5]
at org.apache.jmeter.samplers.RemoteListenerWrapper.sampleOccurred(RemoteListenerWrapper.java:94) ~[ApacheJMeter_core.jar:5.5]
at org.apache.jmeter.threads.ListenerNotifier.notifyListeners(ListenerNotifier.java:58) ~[ApacheJMeter_core.jar:5.5]
at org.apache.jmeter.threads.JMeterThread.notifyListeners(JMeterThread.java:1037) ~[ApacheJMeter_core.jar:5.5]
at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:591) ~[ApacheJMeter_core.jar:5.5]
at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:501) ~[ApacheJMeter_core.jar:5.5]
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:268) ~[ApacheJMeter_core.jar:5.5]
at java.lang.Thread.run(Thread.java:833) ~[?:?]
Caused by: java.net.ConnectException: Connection refused
at sun.nio.ch.Net.connect0(Native Method) ~[?:?]
at sun.nio.ch.Net.connect(Net.java:579) ~[?:?]
at sun.nio.ch.Net.connect(Net.java:568) ~[?:?]
at sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:588) ~[?:?]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) ~[?:?]
at java.net.Socket.connect(Socket.java:633) ~[?:?]
at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:304) ~[?:?]
at sun.security.ssl.SSLSocketImpl.(SSLSocketImpl.java:163) ~[?:?]
at sun.security.ssl.SSLSocketFactoryImpl.createSocket(SSLSocketFactoryImpl.java:88) ~[?:?]
at org.apache.jmeter.rmi.SSLRMIClientSocketFactory.createSocket(SSLRMIClientSocketFactory.java:117) ~[ApacheJMeter_core.jar:5.5]
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:620) ~[?:?]
... 15 more

@heysarthak
Copy link
Author

my plan have 4 thread groups - ultimate thread groups and the structure looks like this
upload2

@3dgiordano
Copy link
Contributor

Hi @heysarthak

1 - The stack it's related to a failure in JMeter RMI communication in JMeter distribute mode.

2 - Currently only recommended use native Thread Group from JMeter.

There are other solutions that use thread creation as a solution to trying to simulate concurrency in a JMeter not intended for asynchronous execution.

The http2 plugin using the http2 controller supports asynchronous execution, but requires that the main thread created by JMeter's Thread Group not be recreated or manipulated, as it maintains state at the thread level.

Other solutions may interfere with that and you may end up creating more instances of the HTTP2 client than you should.
In JMeter's HTTP1 you would not notice because for each request the http client is created and destroyed, but in the BZM plugin of http2 it is required to maintain state information at the thread level, that's why I recommend the use of the Default Thread Group on JMeter.

My recommendation is to first start simulating http2 execution using asynchronous execution with the http2 controller inside a JMeter thread group.
When you have a local functional execution, try scaling it in distributed mode with JMeter.

@heysarthak
Copy link
Author

image

As per your suggestion, i used the thread group by jmeter. I am processing 4 request with a good amount of payload.
I am getting the following error.

image

it is not observed when i am performing it with v2.0.2 alpha 3, not while i am performing the same test with the same payload with v2.0.2

@3dgiordano
Copy link
Contributor

Hi @heysarthak

The HTTP error 413 Request Entity Too Large it's a server-side control, usually related to the file size limit on upload but in some web frameworks or web servers also it's used in other size limits like "body size limit".

It must be analyzed on the server side what is related or associated with the 413 error, it is possible that it is used by some other type of control of size limits.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants