Avatar

Please consider registering
guest

sp_LogInOut Log In sp_Registration Register

Register | Lost password?
Advanced Search

— Forum Scope —




— Match —





— Forum Options —





Minimum search word length is 3 characters - maximum search word length is 84 characters

sp_Feed Topic RSS sp_TopicIcon
OPC UA Performance, Benchmarks?
August 12, 2014
11:18, EEST
Avatar
Allan
Member
Members
Forum Posts: 11
Member Since:
July 22, 2014
sp_UserOfflineSmall Offline

Is there any performance or benchmark information for Prosys OPC UA available?

In particular, we would like to know how many events, OPC UA method calls or variable updates can be handled per second, where the client and server are on different hosts in the local network.

Also, for a device that produces array data, for example up to about a 50Kb array of numeric values: How fast could the client get the data from the server, assuming a fast network and hosts? It seems that only arrays of objects (Number) are supported, an not primitive types. Does that make much difference?

In my own performance tests, I noticed this type of log message on the server side:

“Acknowledge on Subscription 10: 1 – Bad_SequenceNumberUnknown”

I thought I could fix the issue by tuning these items on the client, but with limited success:

dataItem.setSamplingInterval(0.0); // fastest rate
dataItem.setQueueSize(100);

How can you test the maximum performance of OPC UA variable updates, method calls and event updates?

Thanks!

August 13, 2014
8:18, EEST
Avatar
Heikki Tahvanainen
Member
Members
Forum Posts: 402
Member Since:
April 17, 2013
sp_UserOfflineSmall Offline

Is there any performance or benchmark information for Prosys OPC UA available?
How can you test the maximum performance of OPC UA variable updates, method calls and event updates?

There’s no performance or benchmark information publicly available for Prosys OPC UA SDK. This is mostly because of the diversity of applications where SDK is used. However, we have made some performance related tests for development purposes internally.

we would like to know how many events, OPC UA method calls or variable updates can be handled per second, where the client and server are on different hosts in the local network.

In normal situations the OPC UA communication will probably not be the performance bottleneck of your application. At least hundreds of events, method calls or variable updates can be handled per second.
That said, it is possible that certain applications need special performance consideration. One example of a system which needed special performance consideration regarding subscriptions is detailed in this blog post: http://www.prosysopc.com/blog/…..ed-server/

for example up to about a 50Kb array of numeric values: How fast could the client get the data from the server, assuming a fast network and hosts?

Call times for read-method usually are something in the range of one millisecond. However, accurate results may only be acquired by benchmarking the specific system at hand.
In this specific case you could try measuring the call time of client applications read()-method when reading that 50kb array. Java’s System.nanoTime() can be used to benchmark method call times as long as the drawbacks of micro benchmarking are taken into account.
With subscriptions you have two metrics that you probably are interested in: the time it takes to deliver value from server to client and the total throughput of the connection. If you want to analyse the performance of subscriptions, I would advice you to start by timestamping values when they are received at the client application and then comparing these with source timestamps of same data. This way the time to deliver notification values from server to client can be estimated. Remember however that publishing interval affects this value. If timestamps show that delivering values to client application takes longer and longer, then the throughput of the subscription may not be adequate and notification buffers will be filled at some point.

It seems that only arrays of objects (Number) are supported, and not primitive types (Integer). Does that make much difference?

This probably won’t be the bottleneck of performance within your application. However if you are interested in the performance of different data types you could try using OPC UA ByteString (byte []) as your data type and see if that has any effect on your applications performance.

“Acknowledge on Subscription 10: 1 – Bad_SequenceNumberUnknown”

This error message states that server application has already deleted the subscription message that client application is acknowledging. SubscriptionManager class contains method public void setMaxRetransmissionQueueSize(int maxRetransmissionQueueSize) which can be used to set the number of notification messages to keep in the retransmit queue. This can be set in your server application like this:

server.getSubscriptionManager().setMaxRetransmissionQueueSize(1000000);
August 20, 2014
15:16, EEST
Avatar
Allan
Member
Members
Forum Posts: 11
Member Since:
July 22, 2014
sp_UserOfflineSmall Offline

I’m using this code in a performance test (variable and array updates, sending events):

MonitoredDataItem dataItem = createMonitoredDataItem(nodeId, attributeId);
dataItem.setSamplingInterval(0.0); // 0 means use fastest rate

It does not seem to make a difference in performance whether testing over WIFI or ethernet, or even on the localhost.
What is the fastest rate? Is there a special polling interval that is used when SamplingInterval is 0, so that it is not possible to go faster than that rate?

For the performance test the client calls a method on the OPC UA server that starts a timer at a specified interval in microseconds and sets a variable or sends an event.
At some point, making the interval smaller does not have any effect.

August 22, 2014
14:11, EEST
Avatar
Heikki Tahvanainen
Member
Members
Forum Posts: 402
Member Since:
April 17, 2013
sp_UserOfflineSmall Offline

When sampling interval is set from client application with

dataItem.setSamplingInterval(0.0);

then the server application will use fastest possible sampling rate. Current minimum in the SDK is 1 millisecond. However, this value can be set to 0 on the server side, which disables sampling interval completely (every value is reported).

server.getSubscriptionManager().setMinSamplingInterval(0);

If you have some existing application and you’re interested in what is the actual sampling interval that the server application uses, you can see what the CreateMonitoredItemsResponse contains in it’s revisedSamplingInterval field.

August 25, 2014
13:55, EEST
Avatar
Jouni Aro
Moderator
Moderators
Forum Posts: 1026
Member Since:
December 21, 2011
sp_UserOfflineSmall Offline

Heikki Tahvanainen said
If you have some existing application and you’re interested in what is the actual sampling interval that the server application uses, you can see what the CreateMonitoredItemsResponse contains in it’s revisedSamplingInterval field.

This value is also updated to the SamplingInterval of the client side MonitoredDataItem.

August 26, 2014
14:30, EEST
Avatar
Allan
Member
Members
Forum Posts: 11
Member Since:
July 22, 2014
sp_UserOfflineSmall Offline

Thanks for the answers. I noticed different behaviour for sending events and setting variables.

When trying to send events as fast as possible, all events get through to the client, but not as fast as one might expect.

When setting OPC variables, the client is notified more quickly, but not all value changes are passed to the client.
For example, if an OPC integer variable is incremented 100000 times by a timer once per microsecond (or some other very fast rate), the client only receives about 100 actual notifications that the variable changed. I assume this is the expected behaviour, since some hardware devices might produce changes faster than clients can handle them.

So are events always put in a queue and eventually delivered, while variables updates are delivered if there is time, or room in the queue?

Here are some of the server settings I am using for the test:

“`
server.init();

initBuildInfo();

// “Safety limits” for ill-behaving clients
server.getSessionManager().setMaxSessionCount(500);
server.getSessionManager().setMaxSessionTimeout(3600000); // one hour

server.getSubscriptionManager().setMaxSubscriptionCount(500);
server.getSubscriptionManager().setMaxRetransmissionQueueSize(100000);

server.getSubscriptionManager().setMinSamplingInterval(0); // fastest: default is 1 ms
“`

Thanks

August 27, 2014
10:16, EEST
Avatar
Jouni Aro
Moderator
Moderators
Forum Posts: 1026
Member Since:
December 21, 2011
sp_UserOfflineSmall Offline

Each MonitoredItem has a QueueSize, which the client can define. In the Java SDK the default for data items is 1 and for event items UnsignedInteger.MAX_VALUE (.e. unlimited). So, if you enable a small SamplingInterval for data items, you should also reserve a big enough QueueSize that can keep all the samples that may get recorded during a PublishingInterval.

See also: http://www.prosysopc.com/blog/…..-timeouts/

Forum Timezone: Europe/Helsinki

Most Users Ever Online: 1919

Currently Online:
14 Guest(s)

Currently Browsing this Page:
1 Guest(s)

Top Posters:

Heikki Tahvanainen: 402

hbrackel: 144

rocket science: 88

pramanj: 86

Francesco Zambon: 83

Ibrahim: 78

Sabari: 62

kapsl: 57

gjevremovic: 49

Xavier: 43

Member Stats:

Guest Posters: 0

Members: 738

Moderators: 7

Admins: 1

Forum Stats:

Groups: 3

Forums: 15

Topics: 1524

Posts: 6451

Newest Members:

jonathonmcintyre, fannielima, kristiewinkle8, rust, christamcdowall, redaahern07571, nigelbdhmp, travistimmons, AnnelCib, dalenegettinger

Moderators: Jouni Aro: 1026, Pyry: 1, Petri: 0, Bjarne Boström: 1026, Jimmy Ni: 26, Matti Siponen: 346, Lusetti: 0

Administrators: admin: 1