Git Product home page Git Product logo

sarviewer's Introduction

sarviewer

This repository is intended to give a simple way to measure resources usage (CPU, RAM...) in a machine. It uses sar to retrieve data and gnuplot (by default) or matplotlib to generate graphs from it.

Useful to visualize and analyze data during stress tests.

The following graphs based on sar data are generated:

  • CPU usage
  • Load average
  • RAM usage
  • I/O transfer
  • Processes created per second
  • Swap usage
  • Context switches
  • Tasks (run queue, active, blocked)
  • Network interface statistics (eth0 by default)
  • TCP/UDP sockets

Requirements

For basic functionality you will need to install sysstat and gnuplot in your system using your package manager:

# Debian & based
apt-get install sysstat gnuplot
# RHEL & based
yum install sysstat gnuplot

Minimum version required:

  • gnuplot 4.4+
  • sysstat 10.1.5+

You can check your current version with:

# Gnuplot
gnuplot --version
# Sysstat
sar -V

If your current distribution (for example, CentOS 6) doesn't have these versions in repositories by default, you will have to either install the needed package or build from sources.

If you want to generate the graphs using matplotlib (in Python 2.7) you can install it with pip. In case you don't have pip check the official guide to install it using your chosen package manager. Once you have pip just:

pip install matplotlib
  • If you are going to use the mail option (to send the graphs via email) you will need mutt:
# Debian & based
apt-get install mutt
# RHEL & based
yum install mutt

Usage

  • Clone this repo or download it (ZIP format). Note that the files contained in data/ and graphs/ folders are only for sample purposes.
  • By default the graphs are generated using gnuplot. If you want to generate them using matplotlib, change the variable graph_generator in the file sarviewer.properties from gnuplot to matplotlib
  • Network interface statistics are generated for eth0 by default. Change the variable network_interface as needed in sarviewer.properties file.
  • The repo can be used in two modes, depending on your needs. See below.

Mode 1: Begin collecting data and generate graphs

  • Useful for stress tests. Launch the data_collector.sh script if you want to begin collecting data. Specify the number of samples and interval to take each sample. Notice that whenever you want you can cancel the collector with Ctrl+C, interrumpting the collection of data. If it is cancelled you will need to launch the script plotter.sh manually. The data and graphs generated will overwrite the samples given in this repo in data/ and graphs/ folder respectively.
[jota@myserver sarviewer]$ ./data_collector.sh 
Please specify the number of samples to take-> 10
Please specify the sample interval (take sample every X seconds)-> 2
Taking 10 samples with 2 seconds interval
Total time to collect all data: 20 seconds
----------------------------------
>>> Collecting data
>>> Please wait until data collection is completed
----------------------------------
- You can abort this script with Ctrl+C, but have in mind the data will stop being collected when you cancel it.
- You will also need to manually launch script plotter.sh to generate the graphs.
  • Once the script has finished the data collection or you have cancelled it (and subsequently launched plotter.sh) you can analyze the resource usage in the graphs (PNG format) that have been generated in the graphs/ folder of this repo.

  • You can also use parameters with the script, for example:

# Generate 10 samples with 1 second interval between each one
./data_collector.sh -n 10 -i 1

# Generate 10 samples with 1 second interval between each one and send results to mail
./data_collector.sh -n 10 -i 1 -m [email protected]

Mode 2: Read data from sar daemon and generate graphs

  • If you just want to read the data already generated by sar daemon in your system, use the script system_data_reader.sh and choose the sa* file you want to parse to generate the corresponding graphs. Remember that sar daemon should have been previously enabled in /etc/default/sysstat
[jota@myserver sarviewer]$ ./system_data_reader.sh 
List of sa* files available at this moment to retrieve data from:

-------------------------------------------
File sa15 with data from Linux 3.16.0-4-amd64 (myserver) 	04/15/17 	_x86_64_	(8 CPU)
File sa16 with data from Linux 3.16.0-4-amd64 (myserver) 	04/16/17 	_x86_64_	(8 CPU)
File sa17 with data from Linux 3.16.0-4-amd64 (myserver) 	04/17/17 	_x86_64_	(8 CPU)
File sa18 with data from Linux 3.16.0-4-amd64 (myserver) 	04/18/17 	_x86_64_	(8 CPU)
File sa19 with data from Linux 3.16.0-4-amd64 (myserver) 	04/19/17 	_x86_64_	(8 CPU)
File sa20 with data from Linux 3.16.0-4-amd64 (myserver) 	04/20/17 	_x86_64_	(8 CPU)
File sa21 with data from Linux 3.16.0-4-amd64 (myserver) 	04/21/17 	_x86_64_	(8 CPU)
File sa22 with data from Linux 3.16.0-4-amd64 (myserver) 	04/22/17 	_x86_64_	(8 CPU)
File sa23 with data from Linux 3.16.0-4-amd64 (myserver) 	04/23/17 	_x86_64_	(8 CPU)
-------------------------------------------

Note that the number that follows the "sa" file specifies the day of the data collected by sar daemon
Please select a sa* file from the listed above: sa15
  • You can also use parameters with the script system_data_reader.sh, specifying the sa file to parse, start/ending time and an optional email address where you will receive your graphs attached. Examples:
# Send by email day 04 statistics
./system_data_reader.sh -f sa04 -m [email protected]

# Send by email day 04 statistics between 09:00 and 12:00
./system_data_reader.sh -f sa04 -s 09:00 -e 12:00 -m [email protected]

# Send by email day 05 statistics just since 10:00 
./system_data_reader.sh -f sa05 -s 10:00 -m [email protected]

# Just parse day 05 statistics
./system_data_reader.sh -f sa05
  • Parameters are also useful if you want to send statistics periodically with a crontab. Examples:
# Send graphs statistics from present day everyday at 23:30
30 23 * * * /home/jota/scripts/sarviewer/system_data_reader.sh -f sa$(date +\%d) -m [email protected]

# Send graphs statistics from the day before everyday at 23:30
30 23 * * * /home/jota/scripts/sarviewer/system_data_reader.sh -f sa$(date +\%d -d yesterday) -m [email protected]

GNUPLOT samples

Some samples of graphs generated with gnuplot

  • RAM

Alt text

  • CPU

Alt text

  • Load average

Alt text

  • Processes

Alt text

Matplotlib samples

Some samples of graphs generated with matplotlib (Python)

  • RAM

Alt text

  • CPU

Alt text

  • Load average

Alt text

  • Processes

Alt text

sarviewer's People

Contributors

dzaczek avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sarviewer's Issues

Plot multiple network interfaces

One suggestion for future development.

In the properties file, one could specify more than one network interface.

network_interface="eth0 ib0 bond1"

Then, in system_data_reader.sh, just loop over the values.

for i in $network_interface ; do
sar -n DEV -f $sysstat_logdir/$sa_file -s $start_time -e $end_time | grep -w $i | grep -v "Average" > data/netinterface_$i.dat
done

Then, in the plotter.sh do similar task. You can pass parameters to gnuplot by using the -e option, e.g. gnuplot -e "net='$i'" netinterface.gplot

data_collector failing with matplotlib

Generating matplotlib graphs (set graph_generator="matplotlib") using data_collector but failing with following error. I tried with both python2 and python3 versions.

--> /dbc/blr-dbc301/mmopuru/anaconda2/bin/pip install matplotlib
Requirement already satisfied: matplotlib in /dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages
Requirement already satisfied: numpy>=1.7.1 in /dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages (from matplotlib)
Requirement already satisfied: six>=1.10 in /dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages (from matplotlib)
Requirement already satisfied: python-dateutil in /dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages (from matplotlib)
Requirement already satisfied: functools32 in /dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages (from matplotlib)
Requirement already satisfied: subprocess32 in /dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages (from matplotlib)
Requirement already satisfied: pytz in /dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages (from matplotlib)
Requirement already satisfied: cycler>=0.10 in /dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages (from matplotlib)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=1.5.6 in /dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages (from matplotlib)

--> PATH=/dbc/blr-dbc301/mmopuru/anaconda2/bin:$PATH ./data_collector.sh
Please specify the number of samples to take-> 5
Please specify the sample interval (take sample every X seconds)-> 1
Taking 5 samples with 1 seconds interval
Total time to collect all data: 5 seconds
----------------------------------
>>> Collecting data
>>> Please wait until data collection is completed
----------------------------------
- You can abort this script with Ctrl+C, but have in mind the data will stop being collected when you cancel it.
- You will also need to manually launch script plotter.sh to generate the graphs.
----------------------------------
>>> Just 5 seconds more while processing all data
----------------------------------
Done!
Traceback (most recent call last):
  File "tasks.py", line 76, in <module>
	generate_graph()
  File "tasks.py", line 52, in generate_graph
	t_blocked.append(row[6])
IndexError: list index out of range
Traceback (most recent call last):
  File "netinterface.py", line 73, in <module>
	generate_graph()
  File "netinterface.py", line 65, in generate_graph
	plt.savefig('../../graphs/netinterface.png', bbox_inches='tight')
  File "/dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages/matplotlib/pyplot.py", line 697, in savefig
	res = fig.savefig(*args, **kwargs)
  File "/dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages/matplotlib/figure.py", line 1573, in savefig
	self.canvas.print_figure(*args, **kwargs)
  File "/dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages/matplotlib/backend_bases.py", line 2200, in print_figure
	**kwargs)
  File "/dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages/matplotlib/backends/backend_agg.py", line 545, in print_png
	FigureCanvasAgg.draw(self)
  File "/dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages/matplotlib/backends/backend_agg.py", line 464, in draw
	self.figure.draw(self.renderer)
  File "/dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages/matplotlib/artist.py", line 63, in draw_wrapper
	draw(artist, renderer, *args, **kwargs)
  File "/dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages/matplotlib/figure.py", line 1144, in draw
	renderer, self, dsu, self.suppressComposite)
  File "/dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages/matplotlib/image.py", line 139, in _draw_list_compositing_images
	a.draw(renderer)
  File "/dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages/matplotlib/artist.py", line 63, in draw_wrapper
	draw(artist, renderer, *args, **kwargs)
  File "/dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages/matplotlib/axes/_base.py", line 2426, in draw
	mimage._draw_list_compositing_images(renderer, self, dsu)
  File "/dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages/matplotlib/image.py", line 139, in _draw_list_compositing_images
	a.draw(renderer)
  File "/dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages/matplotlib/artist.py", line 63, in draw_wrapper
	draw(artist, renderer, *args, **kwargs)
  File "/dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages/matplotlib/axis.py", line 1136, in draw
	ticks_to_draw = self._update_ticks(renderer)
  File "/dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages/matplotlib/axis.py", line 969, in _update_ticks
	tick_tups = [t for t in self.iter_ticks()]
  File "/dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages/matplotlib/axis.py", line 916, in iter_ticks
	for i, val in enumerate(majorLocs)]
  File "/dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages/matplotlib/dates.py", line 466, in __call__
	dt = num2date(x, self.tz)
  File "/dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages/matplotlib/dates.py", line 401, in num2date
	return _from_ordinalf(x, tz)
  File "/dbc/blr-dbc301/mmopuru/anaconda2/lib/python2.7/site-packages/matplotlib/dates.py", line 254, in _from_ordinalf
	dt = datetime.datetime.fromordinal(ix).replace(tzinfo=UTC)
ValueError: ordinal must be >= 1

Note: I'm collecting sysstats for every 1 minute instead of default 10 mins interval

--> sar
Linux 2.6.32-358.23.2.el6.x86_64 (mmopuru-service.eng.vmware.com)       02/28/2018      _x86_64_        (4 CPU)

12:00:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
12:01:01 AM     all     10.20      0.00      2.54      0.00      0.00     87.26
12:02:01 AM     all      9.81      0.00      2.41      0.00      0.00     87.77
12:03:01 AM     all      9.92      0.00      2.44      0.01      0.00     87.64
12:04:01 AM     all     10.06      0.00      2.50      0.01      0.00     87.42
12:05:01 AM     all      9.81      0.00      2.40      0.03      0.00     87.76
12:06:01 AM     all      9.82      0.00      2.49      0.01      0.00     87.67
12:07:01 AM     all      9.98      0.00      2.42      0.00      0.00     87.59
12:08:02 AM     all      9.87      0.00      2.44      0.00      0.00     87.69
12:09:01 AM     all      9.99      0.00      2.44      0.00      0.00     87.57
12:10:01 AM     all      9.86      0.00      2.47      0.00      0.00     87.66
12:11:01 AM     all      9.92      0.00      2.47      0.01      0.00     87.60
12:12:01 AM     all      9.80      0.00      2.47      0.00      0.00     87.72
12:13:01 AM     all      9.94      0.00      2.48      0.00      0.00     87.57
12:14:01 AM     all      9.92      0.00      2.43      0.01      0.00     87.64
12:15:01 AM     all      9.97      0.00      2.44      0.02      0.00     87.58
12:16:01 AM     all      9.81      0.00      2.41      0.00      0.00     87.78
12:17:01 AM     all      9.96      0.00      2.40      0.01      0.00     87.63
12:18:01 AM     all     10.09      0.00      2.40      0.01      0.00     87.50
12:19:01 AM     all     10.07      0.00      2.46      0.01      0.00     87.46
12:20:01 AM     all      9.92      0.00      2.42      0.00      0.00     87.65

How to Generate Graph From More Than One saFile

Hai julio, It's so interested project from your repository.
In my case I have to generate graphics for a month. So that more than one sa file generated in its graphic. what command should I run to generate more than one sa file?

In existing environment, I convert sa file to sar file, then i merge sar file into one file example sarMerge.txt. And then generate graphic from sarMerge.txt using kSar-2.0.

Big thanks for your help.

Consider explicit time axis formatting in gnuplot

Great tool, thanks for making it available.

I found out one cosmetic issue when running the scripts in SL6. The x axis was showing time and date, date set to 1/1. It is therefore better to specify the X axis format explicitly as follows.

diff --git a/plotters/gnuplot/contextsw.gplot b/plotters/gnuplot/contextsw.gplot
index a9d048f..ef0cfbc 100644
--- a/plotters/gnuplot/contextsw.gplot
+++ b/plotters/gnuplot/contextsw.gplot
@@ -29,6 +29,7 @@ set tics nomirror
set autoscale xy
set xdata time
set timefmt "%H:%M:%S"
+set format x "%H:%M"
set xlabel "Time"
set ylabel "Context switches"

ram.png negative values ?

On a idle server using data_collector.sh to grab a set sample and interval of sar memory stats seems to produce ram.png that shows negative memory usage ?

example of idle

03:18:51 AM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
03:18:52 AM  14085804  18822948     57.20    552972  14613692  12406532     35.44   6276896  10072964         0
03:18:53 AM  14085804  18822948     57.20    552972  14613692  12406532     35.44   6276896  10072964         0
03:18:54 AM  14085804  18822948     57.20    552972  14613692  12406532     35.44   6276896  10072964         0
03:18:55 AM  14085804  18822948     57.20    552972  14613692  12406532     35.44   6276896  10072964         0
03:18:56 AM  14085804  18822948     57.20    552972  14613692  12406532     35.44   6276896  10072964         0
03:18:57 AM  14085804  18822948     57.20    552972  14613692  12406532     35.44   6276896  10072964         0
03:18:58 AM  14085804  18822948     57.20    552972  14613692  12406532     35.44   6276896  10072964         0
03:18:59 AM  14085804  18822948     57.20    552972  14613692  12406532     35.44   6276896  10072964         0
03:19:00 AM  14085804  18822948     57.20    552972  14613692  12406532     35.44   6276896  10072964         0
03:19:01 AM  14085804  18822948     57.20    552972  14613692  12406532     35.44   6276896  10072964         0
Average:     14085804  18822948     57.20    552972  14613692  12406532     35.44   6276896  10072964         0

chart ends up something like

ram

I am using a forked version with a few cosmetic changes in script https://github.com/centminmod/sarviewer

looks like formula is off on CentOS 7 for used memory https://github.com/centminmod/sarviewer/blob/master/plotters/ram.gplot

plot '../data/ram.dat' using 1:($2/1024+$5/1024+$6/1024) title 'Free' with l ls 1, \
'' using 1:($5/1024) title 'Buffers' with l ls 2, \
'' using 1:($6/1024) title 'Cached' with l ls 3, \
'' using 1:($3/1024-$6/1024-$5/1024-$2/1024) title 'Used' with l ls 4

3rd column minus 6th minus 2nd

cat data/ram.dat 
03:16:29     14082768  18825984     57.21    552952  14614432  12413540     35.46   6279684  10073504        48
03:16:31     14082768  18825984     57.21    552952  14614432  12413540     35.46   6279760  10073504        48
03:16:33     14082768  18825984     57.21    552960  14614432  12413540     35.46   6279820  10073504        84
03:16:35     14082644  18826108     57.21    552960  14614432  12413540     35.46   6279820  10073512        84
03:16:37     14082644  18826108     57.21    552960  14614432  12413540     35.46   6279820  10073512        76
03:16:39     14082644  18826108     57.21    552960  14614432  12413540     35.46   6279820  10073512        52
03:16:41     14082644  18826108     57.21    552960  14614432  12413540     35.46   6279820  10073512        52
03:16:43     14082636  18826116     57.21    552960  14614432  12413540     35.46   6279820  10073512         0
03:16:45     14082636  18826116     57.21    552960  14614432  12413540     35.46   6279820  10073512         0
03:16:47     14083220  18825532     57.21    552960  14614432  12409348     35.45   6279820  10073512         0

change plotters/ram.gplot to

plot '../data/ram.dat' using 1:($2/1024+$5/1024+$6/1024) title 'Free' with l ls 1, \
'' using 1:($5/1024) title 'Buffers' with l ls 2, \
'' using 1:($6/1024) title 'Cached' with l ls 3, \
'' using 1:($3/1024) title 'Used' with l ls 4

seems to fix it

ram

running error~

./data_collector.sh
Please specify the number of samples to take-> 2
Please specify the sample interval (take sample every X seconds)-> 1
Taking 2 samples with 1 seconds interval
Total time to collect all data: 2 seconds

Collecting data
Please wait until data collection is completed


  • You can abort this script with Ctrl+C, but have in mind the data will stop being collected when you cancel it.
  • You will also need to manually launch script plotter.sh to generate the graphs.

Just 5 seconds more while processing all data


Done!
"netinterface.gplot", line 41: warning: Skipping data file with no valid points
"netinterface.gplot", line 41: warning: Skipping data file with no valid points

plot '../../data/netinterface.dat' using 1:5 title 'Kilobytes received per second' with l ls 1, '' using 1:6 title 'Kilobytes sent per second' with l ls 2
^
"netinterface.gplot", line 41: x range is invalid
my options:
gnuplot 5.0 patchlevel 3
Python 2.7.12
ubuntu 16.04

Wrong used values in ram graph

I get wrong values for Used, Buffers and Cached. The fix in issue #1 had to be reverted on my part. That issue shows two different outputs from sar -r: one with an annoying AM/PM column and one without. Obviously the column numbers will be shifted depending on the extra AM/PM column.

Not sure if there are ways to tell sysstat to stick to 24h timestamps in the output, or if sarviewer can be adapted to convert AM/PM to 24h when making the ram.dat file? Anyway, these changes in ram.gplot fixed it for me:

From:
'' using 1:($5/1024) title 'Buffers' with l ls 2,
'' using 1:($6/1024) title 'Cached' with l ls 3,
'' using 1:($3/1024-$5/1024-$6/1024) title 'Used' with l ls 4
To:
'' using 1:($6/1024) title 'Buffers' with l ls 2,
'' using 1:($7/1024) title 'Cached' with l ls 3,
'' using 1:($4/1024-$6/1024-$7/1024) title 'Used' with l ls 4_

set terminal pngcairo enhanced font 'Verdana,8'

I'm getting gplot errors while generating graphs. I tried re-installeing gnuplot too after

yum install cairo-devel pango-devel gd-devel

but no luck. I'm using centos 6.4 and gnuplot 4.2.6-2.el6.

$> ./system_data_reader.sh

List of sa* files available at this moment to retrieve data from:

\-------------------------------------------
File sa08 with data from Linux 2.6.32-358.23.2.el6.x86_64 (mmopuru-service.eng.vmware.com)      02/08/18        _x86_64_        (4 CPU)
\-------------------------------------------

Note that the number that follows the "sa" file specifies the day of the data collected by sar daemon
Please select a sa* file from the listed above: sa08

set terminal pngcairo enhanced font 'Verdana,8'
			 ^
"loadaverage.gplot", line 15: unknown or ambiguous terminal type; type just 'set terminal' for a list


set terminal pngcairo enhanced font 'Verdana,8'
			 ^
"tasks.gplot", line 15: unknown or ambiguous terminal type; type just 'set terminal' for a list


set terminal pngcairo enhanced font 'Verdana,8'
			 ^
"cpu.gplot", line 16: unknown or ambiguous terminal type; type just 'set terminal' for a list


set terminal pngcairo enhanced font 'Verdana,8'
			 ^
"ram.gplot", line 16: unknown or ambiguous terminal type; type just 'set terminal' for a list


set terminal pngcairo enhanced font 'Verdana,8'
			 ^
"swap.gplot", line 16: unknown or ambiguous terminal type; type just 'set terminal' for a list


set terminal pngcairo enhanced font 'Verdana,8'
			 ^
"iotransfer.gplot", line 16: unknown or ambiguous terminal type; type just 'set terminal' for a list


set terminal pngcairo enhanced font 'Verdana,8'
			 ^
"proc.gplot", line 16: unknown or ambiguous terminal type; type just 'set terminal' for a list


set terminal pngcairo enhanced font 'Verdana,8'
			 ^
"contextsw.gplot", line 16: unknown or ambiguous terminal type; type just 'set terminal' for a list


set terminal pngcairo enhanced font 'Verdana,8'
			 ^
"netinterface.gplot", line 16: unknown or ambiguous terminal type; type just 'set terminal' for a list


set terminal pngcairo enhanced font 'Verdana,8'
			 ^
"sockets.gplot", line 16: unknown or ambiguous terminal type; type just 'set terminal' for a list

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.