Comments (4)
This is a bit of a crude example of overloading a server to a point that the host itself cannot provide the resources required to serve the request. If I take the same example and apply it against a basic net/http server it will yield the same result.
Here's a gist https://gist.github.com/asim/11aa2e31ddece57b41bf. And the result:
call err: Get http://localhost:9099: dial tcp [::1]:9099: socket: too many open files
2016/03/19 10:55:36 http: Accept error: accept tcp [::]:9099: accept: too many open files; retrying in 5ms
call err: Get http://localhost:9099: EOF
2016/03/19 10:55:36 http: Accept error: accept tcp [::]:9099: accept: too many open files; retrying in 5ms
call err: Get http://localhost:9099: EOF
2016/03/19 10:55:36 http: Accept error: accept tcp [::]:9099: accept: too many open files; retrying in 10ms
call err: Get http://localhost:9099: EOF
2016/03/19 10:55:36 http: Accept error: accept tcp [::]:9099: accept: too many open files; retrying in 20ms
call err: Get http://localhost:9099: EOF
I think its probably first important to determine an appropriate benchmarking test to gauge current performance, then target the bottlenecks. The above is not a test of a "real production system".
from go-micro.
@asim, thanks for your quick response. Just as you mentioned, even net/http client request without client connection pool will cause the issue.
My point is that go-micro rpc framework will be more robust and performance boosting to reuse the established long-live connection.
Http2 protocol can be used to keep long-live connection between go-micro rpc client and server. Maybe go-micro can rely on golang.com/x/net/http2/client_conn_pool.go to provide keep-alive long connection feature to boost the performance.
from go-micro.
I will look into the connection pooling however the thing to remember is that go-micro is a pluggable library made up of a number of components. A client Call will use the client, selector, registry and transport. The server will also make use of the transport. We provide sane defaults but if you want to build performance optimised plugins for each interface you can do this. You're not limited to using the defaults within go-micro. Example plugins are here https://github.com/micro/go-plugins.
Connection pooling is potentially something solved at the transport layer. Either by implementing a new http2 plugin or by adding a connection pooling Option to the existing transport.
from go-micro.
First steps. Benchmarking the transport https://github.com/micro/go-micro/blob/master/transport/http/http_test.go
go test -bench=. -benchtime=10s
testing: warning: no tests to run
PASS
BenchmarkTransport1-4 50000 277117 ns/op
BenchmarkTransport8-4 100000 190061 ns/op
BenchmarkTransport16-4 100000 186685 ns/op
BenchmarkTransport64-4 100000 194432 ns/op
BenchmarkTransport128-4 100000 251565 ns/op
ok github.com/micro/go-micro/transport/http 107.467s
This is on my horrific 1.7 GHz Intel Core i5 2011 macbook air.
from go-micro.
Related Issues (20)
- [BUG] 4.10.2 subscribe can't receive pushlish message
- How can we ensure that the service node is Deregister wehn use zookeeper plugins HOT 1
- Advertise-address not work ? it is docker's ip 172.17.0.2 ??、 HOT 2
- what diffrent gateway with http example?
- How can multiple subscribers on a topic only consume once HOT 2
- [BUG]grpc client Call method bug HOT 1
- [BUG] Always show updates when creating a service (watch) HOT 1
- [BUG] Depreciation Warning: github.com/golang/protobuf HOT 1
- I haven't seen anywhere using the logger.Option.Out for write. Is this variable written here to deceive people?
- trying to send message larger than max (14547977 vs. 4194304) ? HOT 1
- panic: qtls.ConnectionState not compatible with tls.ConnectionState
- [BUG] Version V2.9.1 CLI no longer exists HOT 5
- grpc stream use async socket send, but seem use them same buffer, the newer msg seems overwrite the underlying buffer HOT 4
- Tag latest v3 changes (v3.7.2)
- [go-micro/auth.Inspect()] Is this function working? HOT 2
- how can i writter log to file? HOT 4
- [BUG]micro v4 can't register service HOT 10
- how can i pass http request headers through metadata?
- [BUG] go.micro.client.transport write: broken pipe
- [BUG] for v4.9.0 to RegisterSubscriber with Queue
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from go-micro.