Skip to content

Conversation

andreas
Copy link

@andreas andreas commented Jun 9, 2016

After looking into the issue reported by @Mleonard87 in graphql-go#106, I noticed that list fields were not being evaluated in parallel. This PR changes the behaviour of completeListValue to resolve the elements of the list in parallel. A goroutine is spawned per index j in resultVal and assigns the result into completedResults[j]. Since the goroutine can panic, a separate channel panics is used to communicate those, and repanic in the original goroutine.

No tests included, but the example described by @Mleonard87 runs much faster (would be great if you can confirm, @Mleonard87).

@switchtrue
Copy link

switchtrue commented Jun 10, 2016

Hi @andreas and thanks for doing this.

I've run some tests against both #20 and #21. #21 does not seem to resolving fields in parallel. I've put some logging in my schema in the patients resolve when it initial gets a list of all patients and then before and after the HTTP call it makes in the ehrId resolve function. If you look at the output below you can see that sogko/experiment-parallel-resolve is in fact doing it serially. #20 looks to do it in parallel - multiple STARTS are logged before ENDs, the IDs are out of sequence and the overall time is faster. #21 very much looks the same as sogko/experiment-parallel-resolve.

I've run my load tests again and I'm not seeing any change with the #20 version. However, with individual requests I am definitely seeing a noticeable improvement (stats below). I'm guessing with so many HTTP requests under our load tests I'm just hitting a bottleneck here or on the server at the oither end and no amount of tuning of the GraphQL library is going to solve that.

Average Request Times

When not under load significant improvement were observed. For 10 repeated tests the average times are:

#20: 3.50s
sogko/experiment-parallel-resolve: 9.31s

sogko/experiment-parallel-resolve

2016/06/10 11:04:16 All Patients:
2016/06/10 11:04:16 Id:  12107
2016/06/10 11:04:16 Id:  8012
2016/06/10 11:04:16 Id:  8024
2016/06/10 11:04:16 Id:  8018
2016/06/10 11:04:16 Id:  11675
2016/06/10 11:04:16 Id:  12764
2016/06/10 11:04:16 Id:  8078
2016/06/10 11:04:16 Id:  8006
2016/06/10 11:04:16 Id:  8030
2016/06/10 11:04:16 Id:  11663
2016/06/10 11:04:16 Id:  12089
2016/06/10 11:04:16 Id:  11687
2016/06/10 11:04:16 Id:  8072
2016/06/10 11:04:16 Id:  8054
2016/06/10 11:04:16 Id:  8066
2016/06/10 11:04:16 Id:  12101
2016/06/10 11:04:16 Id:  8042
2016/06/10 11:04:16 Id:  12770
2016/06/10 11:04:16 Id:  8048
2016/06/10 11:04:16 Id:  12758
2016/06/10 11:04:16 Id:  11693
2016/06/10 11:04:16 Id:  8036
2016/06/10 11:04:16 Id:  12095
2016/06/10 11:04:16 Id:  8057
2016/06/10 11:04:16 [START] Resolve EHR Id for:  12107
2016/06/10 11:04:17 [END] Resolve EHR Id for:  12107
2016/06/10 11:04:17 [START] Resolve EHR Id for:  8012
2016/06/10 11:04:19 [END] Resolve EHR Id for:  8012
2016/06/10 11:04:19 [START] Resolve EHR Id for:  8024
2016/06/10 11:04:21 [END] Resolve EHR Id for:  8024
2016/06/10 11:04:21 [START] Resolve EHR Id for:  8018
2016/06/10 11:04:21 [END] Resolve EHR Id for:  8018
2016/06/10 11:04:21 [START] Resolve EHR Id for:  11675
2016/06/10 11:04:22 [END] Resolve EHR Id for:  11675
2016/06/10 11:04:22 [START] Resolve EHR Id for:  12764
2016/06/10 11:04:22 [END] Resolve EHR Id for:  12764
2016/06/10 11:04:22 [START] Resolve EHR Id for:  8078
2016/06/10 11:04:23 [END] Resolve EHR Id for:  8078
2016/06/10 11:04:23 [START] Resolve EHR Id for:  8006
2016/06/10 11:04:23 [END] Resolve EHR Id for:  8006
2016/06/10 11:04:23 [START] Resolve EHR Id for:  8030
2016/06/10 11:04:23 [END] Resolve EHR Id for:  8030
2016/06/10 11:04:23 [START] Resolve EHR Id for:  11663
2016/06/10 11:04:24 [END] Resolve EHR Id for:  11663
2016/06/10 11:04:24 [START] Resolve EHR Id for:  12089
2016/06/10 11:04:25 [END] Resolve EHR Id for:  12089
2016/06/10 11:04:25 [START] Resolve EHR Id for:  11687
2016/06/10 11:04:26 [END] Resolve EHR Id for:  11687
2016/06/10 11:04:26 [START] Resolve EHR Id for:  8072
2016/06/10 11:04:26 [END] Resolve EHR Id for:  8072
2016/06/10 11:04:26 [START] Resolve EHR Id for:  8054
2016/06/10 11:04:26 [END] Resolve EHR Id for:  8054
2016/06/10 11:04:26 [START] Resolve EHR Id for:  8066
2016/06/10 11:04:27 [END] Resolve EHR Id for:  8066
2016/06/10 11:04:27 [START] Resolve EHR Id for:  12101
2016/06/10 11:04:27 [END] Resolve EHR Id for:  12101
2016/06/10 11:04:27 [START] Resolve EHR Id for:  8042
2016/06/10 11:04:27 [END] Resolve EHR Id for:  8042
2016/06/10 11:04:27 [START] Resolve EHR Id for:  12770
2016/06/10 11:04:28 [END] Resolve EHR Id for:  12770
2016/06/10 11:04:28 [START] Resolve EHR Id for:  8048
2016/06/10 11:04:29 [END] Resolve EHR Id for:  8048
2016/06/10 11:04:29 [START] Resolve EHR Id for:  12758
2016/06/10 11:04:29 [END] Resolve EHR Id for:  12758
2016/06/10 11:04:29 [START] Resolve EHR Id for:  11693
2016/06/10 11:04:30 [END] Resolve EHR Id for:  11693
2016/06/10 11:04:30 [START] Resolve EHR Id for:  8036
2016/06/10 11:04:30 [END] Resolve EHR Id for:  8036
2016/06/10 11:04:30 [START] Resolve EHR Id for:  12095
2016/06/10 11:04:30 [END] Resolve EHR Id for:  12095
2016/06/10 11:04:30 [START] Resolve EHR Id for:  8057
2016/06/10 11:04:31 [END] Resolve EHR Id for:  8057

#20

2016/06/10 10:53:39 All Patients:
2016/06/10 10:53:39 Id:  12107
2016/06/10 10:53:39 Id:  8012
2016/06/10 10:53:39 Id:  8024
2016/06/10 10:53:39 Id:  8018
2016/06/10 10:53:39 Id:  11675
2016/06/10 10:53:39 Id:  12764
2016/06/10 10:53:39 Id:  8078
2016/06/10 10:53:39 Id:  8006
2016/06/10 10:53:39 Id:  8030
2016/06/10 10:53:39 Id:  11663
2016/06/10 10:53:39 Id:  12089
2016/06/10 10:53:39 Id:  11687
2016/06/10 10:53:39 Id:  8072
2016/06/10 10:53:39 Id:  8054
2016/06/10 10:53:39 Id:  8066
2016/06/10 10:53:39 Id:  12101
2016/06/10 10:53:39 Id:  8042
2016/06/10 10:53:39 Id:  12770
2016/06/10 10:53:39 Id:  8048
2016/06/10 10:53:39 Id:  12758
2016/06/10 10:53:39 Id:  11693
2016/06/10 10:53:39 Id:  8036
2016/06/10 10:53:39 Id:  12095
2016/06/10 10:53:39 Id:  8057
2016/06/10 10:53:39 [START] Resolve EHR Id for:  8030
2016/06/10 10:53:39 [START] Resolve EHR Id for:  8012
2016/06/10 10:53:39 [START] Resolve EHR Id for:  12107
2016/06/10 10:53:39 [START] Resolve EHR Id for:  11687
2016/06/10 10:53:39 [START] Resolve EHR Id for:  8024
2016/06/10 10:53:39 [START] Resolve EHR Id for:  8006
2016/06/10 10:53:39 [START] Resolve EHR Id for:  12770
2016/06/10 10:53:39 [START] Resolve EHR Id for:  8072
2016/06/10 10:53:39 [START] Resolve EHR Id for:  11663
2016/06/10 10:53:39 [START] Resolve EHR Id for:  8054
2016/06/10 10:53:39 [START] Resolve EHR Id for:  12089
2016/06/10 10:53:39 [START] Resolve EHR Id for:  8078
2016/06/10 10:53:39 [START] Resolve EHR Id for:  8048
2016/06/10 10:53:39 [START] Resolve EHR Id for:  12095
2016/06/10 10:53:39 [START] Resolve EHR Id for:  8066
2016/06/10 10:53:39 [START] Resolve EHR Id for:  12101
2016/06/10 10:53:39 [START] Resolve EHR Id for:  12758
2016/06/10 10:53:39 [START] Resolve EHR Id for:  8042
2016/06/10 10:53:39 [START] Resolve EHR Id for:  8057
2016/06/10 10:53:39 [START] Resolve EHR Id for:  11693
2016/06/10 10:53:39 [START] Resolve EHR Id for:  8018
2016/06/10 10:53:39 [START] Resolve EHR Id for:  12764
2016/06/10 10:53:39 [START] Resolve EHR Id for:  8036
2016/06/10 10:53:39 [START] Resolve EHR Id for:  11675
2016/06/10 10:53:39 [END] Resolve EHR Id for:  8030
2016/06/10 10:53:40 [END] Resolve EHR Id for:  8012
2016/06/10 10:53:40 [END] Resolve EHR Id for:  12107
2016/06/10 10:53:40 [END] Resolve EHR Id for:  8024
2016/06/10 10:53:40 [END] Resolve EHR Id for:  11687
2016/06/10 10:53:40 [END] Resolve EHR Id for:  8057
2016/06/10 10:53:40 [END] Resolve EHR Id for:  8006
2016/06/10 10:53:41 [END] Resolve EHR Id for:  8054
2016/06/10 10:53:41 [END] Resolve EHR Id for:  8072
2016/06/10 10:53:41 [END] Resolve EHR Id for:  12095
2016/06/10 10:53:41 [END] Resolve EHR Id for:  12101
2016/06/10 10:53:41 [END] Resolve EHR Id for:  11663
2016/06/10 10:53:41 [END] Resolve EHR Id for:  12770
2016/06/10 10:53:41 [END] Resolve EHR Id for:  12089
2016/06/10 10:53:41 [END] Resolve EHR Id for:  8018
2016/06/10 10:53:41 [END] Resolve EHR Id for:  12758
2016/06/10 10:53:41 [END] Resolve EHR Id for:  11675
2016/06/10 10:53:41 [END] Resolve EHR Id for:  11693
2016/06/10 10:53:41 [END] Resolve EHR Id for:  8042
2016/06/10 10:53:41 [END] Resolve EHR Id for:  8048
2016/06/10 10:53:41 [END] Resolve EHR Id for:  8066
2016/06/10 10:53:41 [END] Resolve EHR Id for:  8036
2016/06/10 10:53:41 [END] Resolve EHR Id for:  12764
2016/06/10 10:53:41 [END] Resolve EHR Id for:  8078

#21

2016/06/10 11:06:03 All Patients:
2016/06/10 11:06:03 Id:  12107
2016/06/10 11:06:03 Id:  8012
2016/06/10 11:06:03 Id:  8024
2016/06/10 11:06:03 Id:  8018
2016/06/10 11:06:03 Id:  11675
2016/06/10 11:06:03 Id:  12764
2016/06/10 11:06:03 Id:  8078
2016/06/10 11:06:03 Id:  8006
2016/06/10 11:06:03 Id:  8030
2016/06/10 11:06:03 Id:  11663
2016/06/10 11:06:03 Id:  12089
2016/06/10 11:06:03 Id:  11687
2016/06/10 11:06:03 Id:  8072
2016/06/10 11:06:03 Id:  8054
2016/06/10 11:06:03 Id:  8066
2016/06/10 11:06:03 Id:  12101
2016/06/10 11:06:03 Id:  8042
2016/06/10 11:06:03 Id:  12770
2016/06/10 11:06:03 Id:  8048
2016/06/10 11:06:03 Id:  12758
2016/06/10 11:06:03 Id:  11693
2016/06/10 11:06:03 Id:  8036
2016/06/10 11:06:03 Id:  12095
2016/06/10 11:06:03 Id:  8057
2016/06/10 11:06:03 [START] Resolve EHR Id for:  12107
2016/06/10 11:06:04 [END] Resolve EHR Id for:  12107
2016/06/10 11:06:04 [START] Resolve EHR Id for:  8012
2016/06/10 11:06:04 [END] Resolve EHR Id for:  8012
2016/06/10 11:06:04 [START] Resolve EHR Id for:  8024
2016/06/10 11:06:04 [END] Resolve EHR Id for:  8024
2016/06/10 11:06:04 [START] Resolve EHR Id for:  8018
2016/06/10 11:06:05 [END] Resolve EHR Id for:  8018
2016/06/10 11:06:05 [START] Resolve EHR Id for:  11675
2016/06/10 11:06:05 [END] Resolve EHR Id for:  11675
2016/06/10 11:06:05 [START] Resolve EHR Id for:  12764
2016/06/10 11:06:05 [END] Resolve EHR Id for:  12764
2016/06/10 11:06:05 [START] Resolve EHR Id for:  8078
2016/06/10 11:06:06 [END] Resolve EHR Id for:  8078
2016/06/10 11:06:06 [START] Resolve EHR Id for:  8006
2016/06/10 11:06:06 [END] Resolve EHR Id for:  8006
2016/06/10 11:06:06 [START] Resolve EHR Id for:  8030
2016/06/10 11:06:06 [END] Resolve EHR Id for:  8030
2016/06/10 11:06:06 [START] Resolve EHR Id for:  11663
2016/06/10 11:06:07 [END] Resolve EHR Id for:  11663
2016/06/10 11:06:07 [START] Resolve EHR Id for:  12089
2016/06/10 11:06:07 [END] Resolve EHR Id for:  12089
2016/06/10 11:06:07 [START] Resolve EHR Id for:  11687
2016/06/10 11:06:07 [END] Resolve EHR Id for:  11687
2016/06/10 11:06:07 [START] Resolve EHR Id for:  8072
2016/06/10 11:06:08 [END] Resolve EHR Id for:  8072
2016/06/10 11:06:08 [START] Resolve EHR Id for:  8054
2016/06/10 11:06:08 [END] Resolve EHR Id for:  8054
2016/06/10 11:06:08 [START] Resolve EHR Id for:  8066
2016/06/10 11:06:08 [END] Resolve EHR Id for:  8066
2016/06/10 11:06:08 [START] Resolve EHR Id for:  12101
2016/06/10 11:06:09 [END] Resolve EHR Id for:  12101
2016/06/10 11:06:09 [START] Resolve EHR Id for:  8042
2016/06/10 11:06:09 [END] Resolve EHR Id for:  8042
2016/06/10 11:06:09 [START] Resolve EHR Id for:  12770
2016/06/10 11:06:09 [END] Resolve EHR Id for:  12770
2016/06/10 11:06:09 [START] Resolve EHR Id for:  8048
2016/06/10 11:06:10 [END] Resolve EHR Id for:  8048
2016/06/10 11:06:10 [START] Resolve EHR Id for:  12758
2016/06/10 11:06:10 [END] Resolve EHR Id for:  12758
2016/06/10 11:06:10 [START] Resolve EHR Id for:  11693
2016/06/10 11:06:10 [END] Resolve EHR Id for:  11693
2016/06/10 11:06:10 [START] Resolve EHR Id for:  8036
2016/06/10 11:06:11 [END] Resolve EHR Id for:  8036
2016/06/10 11:06:11 [START] Resolve EHR Id for:  12095
2016/06/10 11:06:11 [END] Resolve EHR Id for:  12095
2016/06/10 11:06:11 [START] Resolve EHR Id for:  8057
2016/06/10 11:06:11 [END] Resolve EHR Id for:  8057

@andreas
Copy link
Author

andreas commented Jun 10, 2016

Thanks for confirming @Mleonard87! I think you're right wrt. the latency under load test vs single request.

PR #21 is just a refactoring of the existing code on the sogko/experiment-parallel-resolve-branch with no new functionality, which is why you're seeing the same behavior.

@sogko
Copy link
Owner

sogko commented Jun 11, 2016

Hi @andreas @Mleonard87!
Thanks for taking both of your time to look into this, appreciate it very much!

Definitely missed out on list evaluation previously, great job catching that 👍

I think I can merge both PR #20 and #21, both are improvements over the original implementation. #21 makes it more consistent with how fields are resolved concurrently and how panics are recovered.

Cheers!

Notes:


Tests: Currently, we don't have benchmark tests as part of the suite; since we have been focusing on correctness and conformance to spec, less on perf.

That can be added on a separate PR on this repo before merging to the main repo. (Anybody want to take this up? Probably adapting version of @Mleonard87 tests. (Do you mine sharing your Patients demo? )

Data race: The sogko/experiment-parallel-resolve branch introduced some data race conditions, that this PR inherited as well. Will have to resolve that before merging to main repo.

/cc @chris-ramon

@sogko sogko merged commit 6414283 into sogko:sogko/experiment-parallel-resolve Jun 11, 2016
sogko added a commit that referenced this pull request Jun 11, 2016
… from here

for perf-related PRs.
- simple hello world equivalent
- with a list
- deeper query with list
- query with many root fields and list in each of them
- deeper query with many root fields and lists

To really bring out probable issues with query perf, a latency is
introduced to the data retrieval (previously it was just in-memory data fetch)

When testing against branch before PR #20 and #21, this really highlighted the problem with evaluating list fields.

In the future, more benchmarks for queries with fragments probably would be useful.
@tejasmanohar
Copy link

Is anyone currently working on this? If not, are you using some other library instead? It seems pretty crucial to parallelize this in order to avoid N+1 queries.

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

Successfully merging this pull request may close these issues.

4 participants