Dear all,
on one of our applications based on RestXQ services running on 9.0.2 we
experience a strange behaviour related to concurrency.
It is a stateless service running on a server with http-local set to
true. So no database access. We removed all accesses to sessions and the
code doesn't even write to files or other external resources. It's
really only computation.
When I run multiple requests, I can clearly see that they are accepted
simultaneously (up to 8 which matches PARALLEL). They even complete out
of order according to the session id reported in the log. [1]
The strange thing is: performance seems to be as if calls were executed
serially. If T is the time to complete one call then the pattern is T +
T + T + T + T.
I have to add that the algorithm is rather complex. Lots of functions
(possibly inlined, private and the main one even recursive) which filter
and transform a large XML request into a possibly large XML output.
If I simplify the called RestXQ to something like [2] then I get a log
like [3] which shows a pattern like the one I'm expecting T+d+d+d+d
where d is just a slight overhead (orders of magnitude smaller).
My question is what do I have to check in order to understand where the
hard synchronization of the calls occurs? Might this be related to
non-deterministic functions? What else?
I've tried to isolate parts of the code but I'm unable to get
predictable results.
Thank you very much for all the hints you will be able to provide!
Regards,
Marco.
[1]
17:10:19.204 127.0.0.1:58038 admin REQUEST [POST]
http://localhost:8081/rate-selector/select-matching-rates
17:10:19.204 127.0.0.1:58040 admin REQUEST [POST]
http://localhost:8081/rate-selector/select-matching-rates
17:10:19.205 127.0.0.1:58042 admin REQUEST [POST]
http://localhost:8081/rate-selector/select-matching-rates
17:10:19.205 127.0.0.1:58044 admin REQUEST [POST]
http://localhost:8081/rate-selector/select-matching-rates
17:10:19.208 127.0.0.1:58046 admin REQUEST [POST]
http://localhost:8081/rate-selector/select-matching-rates
17:10:21.325 127.0.0.1:58040 admin 200 2121.01 ms
17:10:23.174 127.0.0.1:58046 admin 200 3965.74 ms
17:10:25.035 127.0.0.1:58038 admin 200 5830.63 ms
17:10:26.889 127.0.0.1:58044 admin 200 7683.76 ms
17:10:28.739 127.0.0.1:58042 admin 200 9534.46 ms
[2]
(:~
: Test concurrency
:)
declare
%rest:path("/test")
%rest:POST("{$body}")
function rs:test($body as node()) {
<a>{$body}{fold-left(1 to 10000000, 0, function($acc, $next){ $acc +
math:sqrt($next)})}</a>
};
[3]
17:48:02.782 127.0.0.1:48262 admin REQUEST [POST]
http://localhost:8081/rate-selector/test
17:48:02.783 127.0.0.1:48252 admin REQUEST [POST]
http://localhost:8081/rate-selector/test
17:48:02.783 127.0.0.1:48258 admin REQUEST [POST]
http://localhost:8081/rate-selector/test
17:48:02.784 127.0.0.1:48260 admin REQUEST [POST]
http://localhost:8081/rate-selector/test
17:48:02.784 127.0.0.1:48254 admin REQUEST [POST]
http://localhost:8081/rate-selector/test
17:48:04.428 127.0.0.1:48262 admin 200 1646.03 ms
17:48:04.509 127.0.0.1:48260 admin 200 1725.45 ms
17:48:04.710 127.0.0.1:48254 admin 200 1926.27 ms
17:48:04.772 127.0.0.1:48258 admin 200 1988.41 ms
17:48:04.904 127.0.0.1:48252 admin 200 2120.33 ms