Hi All, Just thought I'd let you know how I went with the rate limiter. After several searches on Google about why rate limiter does not generate events at the rate I requested, I hit on the following issue on Github and saw this comment from Chris Hines about setting a burst value equal to the limiter limit i.e. if the desired rate is 2000, then set burst to 2000 as well.
https://github.com/golang/go/issues/47084#issuecomment-897291261 With this change to my code, I was able to get events generated at the rate I specify i.e. if I configure my application to generate 1000 transactions per second (TPS), I get 1000. If 5000, then I get 5000 etc. It appears this is something to do with the change to the netpoller sleep interval granularity being 1ms on linux. For now, I am able to generate transactions at the rate I specify, so I am in a much better position as of now - with no loss of TPS. On Friday, 4 February 2022 at 17:27:43 UTC+11 envee wrote: > Uli, Robert, > I finally settled on using the rate limiter package to achieve what I > need. I have a machine with 40 vCPUs and when I use a rate limiter with a > rate limit of 1000, I am able to generate HTTP requests at that rate. > (There are other processes running on this RHEL 7 machine, but it is very > lightly loaded). > > When I increase the limit to anything higher than 3000 TPS (transactions > per second), my program can only generate 1000 TPS less than that rate. > For example, if I need to send 4000 TPS, I can see (using some custom > Prometheus metrics), that I am generating only 3000 TPS. Likewise, if I set > the limit to 8000 TPS, I can see request rate of 7000 TPS. > I can live with that for now. Because atleast I have a mechanism to > control the rate and get close to what I need. > > I will see if I can tune my program any further to get much closer to the > desired rate. > > Thank you all for your help. > > On Thursday, 3 February 2022 at 19:05:02 UTC+11 Amnon wrote: > >> > From the tests that I have performed, I can see that a Ticker pretty >> accurately fires at every 1ms interval. >> >> It will depend on the load on your machine. As the load on the machine >> increases, so with the jitter in the tick time. >> >> On Thu, Feb 3, 2022 at 1:19 AM Robert Engels <ren...@ix.netcom.com> >> wrote: >> >>> I am unclear why you need to use an N of M. I would make sure the >>> hardest case is handled and you can use a variety of techniques to >>> partition the work. >>> >>> On Feb 2, 2022, at 6:58 PM, envee <neeraj....@gmail.com> wrote: >>> >>> And I forgot to mention that approach I mentioned talks about waking up >>> N goroutines at a time. The way I plan to do is to select a range of N >>> goroutines from my list of goroutines and only allow those goroutines to >>> send HTTP requests. >>> I could use this approach to select the N goroutines or even use a >>> Semaphore. I presume using a Semaphore, will allow a good amount of random >>> N goroutines out of M goroutines to execute. >>> >>> On Thursday, 3 February 2022 at 10:26:28 UTC+11 envee wrote: >>> >>>> Thanks Robert, Uli and Ian for your suggestions. >>>> >>>> I think what I will probably do is use a Ticker with a duration of 1ms. >>>> At every 1ms, I will "wake-up" N number of goroutines to trigger HTTP >>>> requests. >>>> That number N = (request rate per second / 1000) = requests per ms. >>>> So, if I need to ensure a rate of 10000 requests per second, I believe >>>> it should be possible for the Ticker to return after every 1ms and then >>>> fire about 10 requests at every such interval. >>>> From the tests that I have performed, I can see that a Ticker pretty >>>> accurately fires at every 1ms interval. >>>> I think it's only when the Ticker duration falls below 1ms, that I see >>>> issues. >>>> >>>> If my desired rate is less than 1000 per second, then I will create a >>>> Ticker to return every 1000/request rate milliseconds, which will be a >>>> number greater than 1ms. >>>> >>>> This approach is closely based on Robert's suggestion about using a >>>> higher duration for Ticker time and waking up a small subset of goroutines. >>>> >>>> I think it should be ok for a client to be accurate at the level of >>>> granularity of 1ms. >>>> >>>> >>>> On Thursday, 3 February 2022 at 01:14:20 UTC+11 ren...@ix.netcom.com >>>> wrote: >>>> >>>>> Because 20000 is a magnitude larger than 2000. >>>>> >>>>> > On Feb 1, 2022, at 1:44 PM, Uli Kunitz <uli.k...@gmail.com> wrote: >>>>> > >>>>> >>>> -- >>> You received this message because you are subscribed to the Google >>> Groups "golang-nuts" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to golang-nuts...@googlegroups.com. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/golang-nuts/209b18aa-1317-4d72-80a1-222f10a26013n%40googlegroups.com >>> >>> <https://groups.google.com/d/msgid/golang-nuts/209b18aa-1317-4d72-80a1-222f10a26013n%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >>> -- >>> >> You received this message because you are subscribed to a topic in the >>> Google Groups "golang-nuts" group. >>> To unsubscribe from this topic, visit >>> https://groups.google.com/d/topic/golang-nuts/3GUnjdoWjqU/unsubscribe. >>> To unsubscribe from this group and all its topics, send an email to >>> golang-nuts...@googlegroups.com. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/golang-nuts/F912EE7E-4F80-4C16-ABC1-943572FD576C%40ix.netcom.com >>> >>> <https://groups.google.com/d/msgid/golang-nuts/F912EE7E-4F80-4C16-ABC1-943572FD576C%40ix.netcom.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/3cf90126-e41f-4514-85ab-c4d4cf3da859n%40googlegroups.com.