I'm working with a Service Fabric application which I'm not quite able to get to perform as well as hoped.
The main issue is related to one actor calling another. I'm logging how long a given call takes as seen from the calling actor, and I log the time spent on the receiving actor.
What I see, is that the receiving actor logs that the workload takes a few milliseconds (20 at the most). However, the calling actor logs anything from 50 ms up to well over 2 seconds. The delay I cannot account for, comes before the actual logic runs. Once the method returns, the calling actor gets the response quickly.
Is this as can be expected? It is definitely worst when creating a brand new actor instance - but I see this sort of thing even when I'm calling an actor I did a different call to moments earlier.
The parameters passed is fairly basic - I don't suspect deserialization to be the issue.
I realize that actors will get distributed inside the cluster, but overhead on this scale seems out of proportion.
So, my question is: Is this "as expected" or does it indicate we're doing something wrong?
I will add that this is in a quiet test environment, so actors being locked up by other requests is not the issue.
I can provide more info upon request, but I'm not quite sure what might be most relevant.
There are many variables to consider in your scenario, and the bottleneck might be everywhere. As you might be aware to call an actor and get a response you require many steps. I will provide a few common and you investigate further.
So, if you consider these basic points, your service might be hitting the network & discovery latency, serialization and concurrency scheduling, actor creation & data synchronization.
Based on your scenario, I would assume the issue is concurrency more than anything else. Probably you have something locking the actor after\before the following requests
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With