Is profiling enabled by default for all go programs? - go

Since importing net/http/pprof package is enough to enable the golang profiler in a program, my question is, is the profiler enabled by default for all golang programs, and importing the package just exposes the metrics endpoint? If that is the case, how could I disable the profiler to eliminate performance overhead?

Is profiling enabled by default for all go programs?
No.
is the profiler enabled by default for all golang programs, and importing the package just exposes the metrics endpoint?
No.
If that is the case, how could I disable the profiler to eliminate performance overhead?
No, that's not the case.

If you look at the source code of the pprof.go file, you can see in its handlers, that the profiling, tracing etc. are running only when you do a GET on any of its endpoints.
If you specify a time, for example: http://localhost:6060/debug/pprof/trace?seconds=10 the server will take 10 seconds to respond with the trace data. So the profiling is happening only if you call on an endpoint.
You can find some examples in the first comment block of the pprof.go file.

Related

Why it is recommended to run load test in non gui mode in jmeter

I'm monitoring the connect time and latency to connect from jmeter machine while running in GUI mode and that is in within acceptable limit.
Should we strictly follow non GUI mode even though I can able to perform load test with GUI mode?
I'm targeting 250 TPS and able to achieve that ..I have increased my memory and monitoring CPU and memory of load generator is below 60%.
Should I go for non GUI mode ?
The main limitation is that each event in the queue is being handled by a single event dispatch thread which will act as the bottleneck on your JMeter side.
My expectation is that your "250 TPS" look like:
while it should look like:
So check how does your load pattern look like using i.e. Transactions per Second listener (installable via JMeter Plugins Manager)
Also check how does your JVM look like especially when it comes to garbage collection, it can be done via i.e. JVisualVM, most probably you will see the same "chainsaw" pattern
You don't need to follow JMeter best practices, but
you may encounter issues to achieve specifc goals (as TPS)
your machine can't execute GUI or have low resources
you execute JMeter using a script or build tool as Jenkins
Also it's better to be familiar with JMeter CLI (non GUI) and its report capabilities
JMeter supports dashboard report generation to get graphs and statistics from a test plan.
Also it will be needed for using distributed testing
consider running multiple CLI JMeter instances on multiple machines using distributed mode (or not)
CLI also useful for Parameterising tests
The "loops" property can then be defined on the JMeter command-line:
jmeter … -Jloops=12

Profiling Golang server

I want to profile a simple webserver that I wrote in Go. It accepts requests, maps the request to avro object and sends it to Kafka in a go routine. The requirement is that it answers immediately and sends an object to the Kafka later. Locally it answers in under 1 ms on average. I have been trying to profile it by starting the script with davecheney/profile package and sending test requests with jmeter. I can see in the output that the profile file is generated but it remains empty, no matter how long jemeter is sending the requests. I'm running it on Mac El Capitan. I read that there were some issues with profiling on Mac but it would be working on El Capitan. Do you have any tips?
Firstly, I'm not sure whether you're trying to do latency profiling. If so, be aware that Go's CPU profiler only reports time spent by a function executing on the CPU and doesn't include time spent sleeping, etc. If CPU Profiling really is what you're looking for, read on.
If you're running a webserver, just include the following in your imports (in the file where main() is) and rebuild:
import _ "net/http/pprof"
Then, while applying load through jmeter, run:
go tool pprof /path/to/webserver/binary http://<server>/debug/pprof/profile
The net/http/pprof package provides profiling hooks that allow you to profile your webserver on demand any time, even while it's running in production. You may want to use a different, firewalled port for it, though, if your webserver is meant to be exposed publicly.

How big is pprof import overhead in go

I have a couple of go programs that have a unused inport of net/http/pprof in them.
import _ "net/http/pprof"
...
//http.ListenAndServe("127.0.0.1:6060", nil)
I was wondering what the overhead of this import is in term of CPU and Mem. Aka. Should I remove then in prod (yes), but what would be the impact if I forgot?
Related: what are the exact sideeffects of this import? It registers some http handlers, but does it also inject things in go's malloc functions?
The overhead of importing the net/http/pprof package is pretty limited: it just installs some handlers for the http server. See the source code at:
http://golang.org/src/pkg/net/http/pprof/pprof.go
CPU profiling is not activated at initialization time, it is only activated for a period of time (30 seconds by default) when the /debug/pprof/profile REST service is called. So compiling with this package should not impact much the performance of the application (except that extra goroutines for the http server are needed).
Now, during the execution of /debug/pprof/profile, CPU sampling is activated, so a performance overhead is expected. I guess it can be used for production code provided the access to the corresponding port is restricted to the administrators of the application.

How can I monitor my Application server or Database server from Jmeter scripts ? Can we check CPU , memory utilization, etc?

I need to know till what extend we can analyze our Application using Apache Jmeter.
My script creation is complete. Paramatrized & Correlated. Now I need a deep understanding of Analysis.
Earlier, I just use to focus on Response time, Standard deviation, throughput, etc.
But now my boss wants me to do more analysis. Please help me guys.
You can use these Samplers from JMeter-plugins project:
http://jmeter-plugins.org/wiki/DbMon/
http://jmeter-plugins.org/wiki/JMXMon/
Correctly still divide the tasks and means to solve them. If you need to monitor the parameters of the server utilization - then it needs to use the appropriate means, for example, zabbix. If you need to understand how much resources consumes your server applications - it is necessary to refer to the appropriate monitoring tools, plug-ins, such as Zorka for WebSphere in zabbix.

Is it possible to determine the size (memory footprint) of an application scoped variable in ColdFusion?

We use FusionReactor which will show the overall memory usage at the server level, but it would be useful to be able to see how much memory individual items stored in the application scope are taking up.
Have you looked at http://www.fusion-reactor.com/fr/ or http://www.seefusion.com/
I think both of these server monitors could help you out
CFSimplicity,
The Enterprise version of ColdFusion 8 and higher has the Server monitor. The Server Monitor can breakdown memory usage and find out what requests and what variable scopes are consuming how much memory. FusionReactor currently can not.
According to a post on the FusionReactor group: http://groups.google.com/group/fusionreactor/browse_thread/thread/8a017a61d17e9840/d57cef46b843207d?lnk=gst&q=memory+request#d57cef46b843207d
James Holmes said:
A CF Standard install could make use
of the Java SizeOf() class:
sizeof.sourceforge.net
sourceforge.net/projects/sizeof
Some custom code would be necessary to
create a monitor based on this, but
it does work. mxAjax / CFAjax docs
and other useful articles:
www.bifrost.com.au/blog/
Is this something that you need to do in real time and/or in production for monitoring? Or is this just something that you need for debugging?
I would suggest just using one of the JVM memory dump tools or maybe launching your app with the JRockit jvm and doing some live analysis with that.
http://www.schierberl.com/blog/coldfusion-memory-leaks-part-i-profiler-introduction/
It is possible to see the Application Scope size from ColdFusion, using FusionReactor Application Performance Monitor http://www.fusion-reactor.com - this information is currently captured and stored in one of the log files. It is also possible to visualize this information using FusionAnalytics - which is able to display and analyze the metrics which have been captured from FusionReactor. You can see an example of this here - http://docs.intergral.com/display/FA205/CF+Scope+Sizes

Resources