9 Eylül 2020 Çarşamba

PostgreSQL High Memory Utilization var mı nasıl kontrol edilir?

 PostgreSQL memory kullanımı fazla ise neler kontrol edilmesi gerekir?

Memoryden okumak her zaman diskten okumadan daha ölçülebilirdir, yani bütün database teknolojileri için kullanabildiğiniz kadar memory kullanmak isteyebilirsiniz.

Yaptığınız ayarlardan emin değil veya bir hatanız varsa, bu high memory utilization veya out-of-memory bile oluşturur.


Burada, nasıl PostgreSQL memory kullanımını kontrol edebileceğimize ve hangi parametreleri dikkate almanız gerektiğine bakacağız.

PostgreSQL mimarisi ile başlayalım.


PostgreSQL mimarisi

PostgreSQL mimarisi 3 temel parça üzerine kurulmuştur.

Processler, Memory ve Disk.


Memory iki sınıfa kategori edilebilir:


Local Memory: Her arka plan process’i tarafından kendi querileri işlemek için yüklenir ve alt alanlara ayrılmıştır.


*Work mem: Work mem ORDER BY ve DISTINCT işlemlerine göre tuple’ları sıralamak ve tabloları birleştirmek için kullanılır.


*Maintenance work mem: Bu alan bazı bakım işlemlerinde kullanılır.Örneğin, VACUUM, eğer "autovacuum_work_mem" belirtilmemişse.


*Temp buffers: Geçici tabloları depolamak için kullanılır.


Shared Memory: PostgreSQL server başlatıldığında PostgreSQL tarafından ayrılır ve onun işlemlerinde kullanılır. Alt alanlara ayrılmıştır.


*Shared buffer pool: PostgreSQL direkt memoryden çalışmak ve diske erişimi azaltmak için sayfalarla tabloları ve indexleri diskten yükler.


*WAL buffer:  The WAL data databasedeki işlem günlüğüdür ve değişiklikleri içerir. WAL buffer WAL data nın diske verilerini yazmadan önce verileri geçici olarak tuttuğu alandır.

Bu, kontrol noktası adı verilen önceden tanımlanmış bazı zamanlarda yapılır. Bir sunucu arızası durumunda bilgi kaybını önlemek için bu çok önemlidir.


* Commit log: Eşzamanlılık için bütün işlemleri kaydeder.


Ne olduğunu nasıl anlarsınız?

Eğer yüksek miktarda memory kullanımı varsa önce bu tüketimi yapan processin hangisi olduğunu belirleyiniz.

"Top" linux komutunu kullanın.


Muhtemelen buradaki en iyi seçenek "top" komutu ("htop" komutu da aynı işlevi görmektedir.)

Top komutu ile memory tüketen her bir processi ve processleri görebilirsiniz.

Yüksek miktarda memory kullanımından PostgreSQL sorumlu olduğundan emin olduktan sonra neden olduğunu kontrol edelim.


PostgreSQL Log'u kullanmak

Loglara baktığımızda aşağıdaki gibi bir mesaj ile karşılaşabiliriz:

"Resource temporarily unavailable

 

Out of memory: Kill process 1161 (postgres) score 366 or sacrifice child"


Eğer yeterli memory yoksa veya birden fazla hata varsa bunun gibi:

"FATAL:  password authentication failed for user "username"

 

ERROR:  duplicate key value violates unique constraint "sbtest21_pkey"

 

ERROR:  deadlock detected"


Beklenmedik davranışlar ile karşılaştığınızda database tarafında bu yüzden loglar kullanışlıdır bir sorunu belirlemede ve daha fazlasında.

Aslında bu logları parse edip alarmlar da oluşturabilirsiniz (“FATAL”, “ERROR” veya “Kill”).


Pg_top Kullanımı


Eğer bir PostgreSQL process’in yüksek memory kullandığını biliyor, ama bunu log dosyaları size yardımcı olmuyorsa, pg_top size yardımcı olacak kullanışlı bir araçtır.

Bu araç Linux Top ile benzerdir, ama özellikle PostgreSQL içindir. Yani, onu kullandığınızda database’niz üzerinde daha detaylı bilgi sahibi olursunuz, ve querileri kill edebilir, veya çalışan bir job’ın üzerinde yanlış bir şey var ise bunları tespit edebilirsiniz.


Ama database üzerinde bir error tespit edemediniz ve hala yüksek miktarda memory tüketiyorsa. O zaman muhtemelen database’inizin konfigürasyonuna bakmanız gerekecek.


Hangi konfigürasyon parametrelerini dikkate almak gerekir

Eğer herşey iyi gözüküyor ama hala yüksek memory kullanımı sorunu varsa,

konfigürasyonu kontrol etmeli ve doğru olduğundan emin olmalısınız.

Yani aşağıdaki parametreleri dikkate almalısınız.


Shared_buffers

Bu database sunucusunun kullandığı shared memory de kullandığı memory miktarıdır. Eğer bu çok az olursa, database daha fazla diski kullanır ve daha fazla yavaş olmasına sebep olur. Ama çok fazla olursa yüksek memory kullanımı oluşur.Dökümana göre, eğer database sunucusuna 1GB veya üzerinde RAM atanırsa, başlangıç olarak shared_buffer sistemdeki memory’nin %25’ni kullanır.


work_mem

Diskteki geçici dosyaya yazmadan önce ORDER BY, DISTINCT ve JOIN özel olarak kullandığı memory miktarıdır. Shared_buffers da olduğu gibi, bu parametreyi çok düşük miktarda verilirse, bir çok işlemimiz disk’e gider, ama fazlası memory kullanımı için tehlikeli olabilir. Varsayılan değeri 4 MB'dır.


max_connections

work_mem ayrıca  max_connecitons değeriyle el ele gider, çünkü her bağlantıda bu işlemleri aynı anda yürütür ve her işlemin geçici dosyalara veri yazmadan önce bu değerle belirtilen kadar memory kullanmasına izin verilecektir.

Bu parametre database bağlanan max eş zamanlı bağlantı sayısını belirler, eğer bağlantı sayısını yüksek ayarlarsak bu bize kaynak yetersizliği sorunları oluşturacaktır. Varsayılan değeri 100’dür.


temp_buffers

temp_buffers her oturumda geçici tabloları tutmak için kullanılır.

Bu parametre bu iş için en fazla memory alanını ayarlar. Varsayılan değeri 8 MB’dir.


maintenance_work_mem

Bu bir işlemin Vacuuming, adding indexes veya foreign keys tüketebileceği en fazla memory miktarıdır. İyi tarafı bu tip bir işlem bir oturum içinde bir işlem olarak çalışır ve çok yaygın bir şey değildir bir oturum içinde birden fazla işlem çalıştırması.Varsayılan değeri 64 MB’dır.

autovacuum_work_mem

Vacuum maintenance_work_mem’i kullanırım varsayılan olarak, ama onu bu parametre yardımıyla ayırabiliriz.  Her bir autovacuum worker için max memory kullanımını belirleyebiliriz.


wal_buffers

Diske henüz yazılmamış WAL data için kullanılan shared memory miktarıdır.

Varsayılan olarak shared_buffers’ın %3’dür, ama 64kb az olamaz ve WAL bölümünden de çok olamaz, tipik olarak 16 MB’dır.



Sonuç

Birden fazla sebebi olabilir yüksek memory kullanımının.
Biz burada sorunu bulmak için bakmanız gereken noktaları işaret etmeye çalıştık.

2 Mayıs 2018 Çarşamba

GraphPing Installation on Debian 9

GraphPing Installation

You can reach the following link of the Source code of graphping; 
https://github.com/jaxxstorm/graphping

System upgrade
$sudo apt-get -y upgrade
$sudo apt-get -y install git curl

Nodejs Installation
$curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
$sudo apt-get update
$sudo apt-get install -y build-essential libssl-dev nodejs
$sudo npm install nodeunit

Graphping clone
$git clone https://github.com/jaxxstorm/graphping.git

Go installation
$wget https://dl.google.com/go/go1.10.1.linux-amd64.tar.gz
$sudo tar -xvfz go1.10.1.linux-amd64.tar.gz
$sudo mv go /usr/local
$export GOROOT=/usr/local/go
$export GOPATH=$HOME/graphping
$export PATH=$GOPATH/bin:$GOPATH/bin:$PATH

Check the Go version and env
$go version
$go env

Glide installation
$mkdir -p graphping/bin
$mkdir -p graphping/src
$cd graphping
$curl https://glide.sh/get | sh

Build and installing the graphping
$cd graphping
$go build main
If you get to any packet missing error you can get download like following commands
$go get github.com/Sirupsen/logrus
$go get github.com/cactus/go-statsd-client/statsd
$go get github.com/jaxxstorm/graphping/config
$go get github.com/jaxxstorm/graphping/ping
$go get gopkg.in/urfave/cli.v1
$sudo ln -s /home/arm/graphping/main /usr/local/bin/graphping
$graphping -h

$sudo nano /etc/systemd/system/graphping.service
[Unit]
After = network.target
[Service]
ExecStart = /usr/local/bin/graphping -c /home/arm/graphping/examples/example.json -s 127.0.0.1:8125
[Install]
WantedBy = multi-user.target
$sudo systemctl enable graphping.service


Statsd Installation
$sudo adduser statsd
$sudo git clone https://github.com/etsy/statsd.git
$sudo mkdir -p /etc/statsd
$sudo cp statsd/exampleConfig.js /etc/statsd/config.js
$sudo nano /etc/systemd/statsd.service
[Service]
ExecStart=/usr/bin/node /opt/statsd/stats.js /etc/statsd/config.js
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=statsd
User=statsd
Group=statsd
Environment=NODE_ENV=production</code>
[Install]
WantedBy=multi-user.target


$sudo nano /etc/statsd/config.js
{
influxdb: {
version: 0.9, // !!! we installed 0.9
host: '127.0.0.1', // InfluxDB host. (default 127.0.0.1)
port: 8086, // InfluxDB port. (default 8086)
database: 'graphping', // InfluxDB database instance. (required)
username: 'demo', // InfluxDB database username. (required)
password: 'demo', // InfluxDB database password. (required)
flush: {
enable: true // Enable regular flush strategy. (default true)
},
//proxy: {
//enable: false, // Enable the proxy strategy. (default false)
//suffix: 'raw', // Metric name suffix. (default 'raw')
//flushInterval: 1000 // Flush interval for the internal buffer.
// (default 1000)
//} packets should be "repeated" (duplicated to)..d process starts ['up' or 'down', default: 'up']
},
port: 8125, // StatsD port.
backends: ['./backends/console', 'statsd-influxdb-backend'],
debug: false,
legacyNamespace: false
}

$sudo systemctl enable statsd.service
$sudo systemctl start statsd.service
$sudo systemctl status statsd.service
$sudo journcalctl -f -u statsd
$ npm install statsd-influxdb-backend -d


Influxdb Installation
By the way statsd is only support version of 0.9 yet
$wget https://s3.amazonaws.com/influxdb/influxdb_0.9.5.1_amd64.deb
$sudo dpkg -i influxdb_0.9.5.1_amd64.deb
$sudo systemctl start influxdb.service
You have to create a database and user for connect to influxdb via statsd
You can reach via http://ip-of-the-influxdb::8083
Test the graphping following command
$sudo graphping -c graphping/examples/example.json -s 127.0.0.1:8125

Check the measurements via web ui of influxdb.
It has to be like the image.


Start the graphping
$sudo systemctl start graphping.service

Grafana Installation
$sudo nano /etc/apt/sources.list
deb https://packagecloud.io/grafana/stable/debian/ stretch main
$curl https://packagecloud.io/gpg.key | sudo apt-key add -
$sudo apt-get update
$sudo apt-get install grafana
$sudo systemctl enable grafana-server
$sudo systemctl start grafana-server
You can reach via http://ip-of-the-grafana:3000

10 Nisan 2018 Salı

Linux System check


Linux System check in 60 seconds 

$uptime
The current time, how long the system has been running, how many users are currently logged on, and the system load averages for the past 1, 5, and 15 minutes.

$dmesg | tail
dmesg is used to examine or control the kernel ring buffer.
The default action is to display all messages from the kernel ring buffer.

$vmstat 1
 vmstat reports information about processes, memory, paging, block IO, traps, disks and cpu activity.

$mpstat -P ALL 1
The mpstat command writes to standard output activities for each available processor, processor 0 being the first one.  Global average activities among all processors are also reported.  The mpstat com‐
       mand can be used both on SMP and UP machines, but in the latter, only global average activities will be printed. If no activity has been selected, then the default report is the CPU utilization report.

$pidstat 1
 The pidstat command is used for monitoring individual tasks currently being managed by the Linux kernel.  It writes to standard output activities for every task selected with option -p or for every task
       managed  by  the  Linux kernel if option -p ALL has been used. Not selecting any tasks is equivalent to specifying -p ALL but only active tasks (tasks with non-zero statistics values) will appear in the
       report.

$iostat -xz 1
 The iostat command is used for monitoring system input/output device loading by observing the time the devices are active in relation to their  average  transfer  rates.  The  iostat  command  generates
       reports that can be used to change system configuration to better balance the input/output load between physical disks.

$free -m
free  displays  the  total amount of free and used physical and swap memory in the system, as well as the buffers and caches used by the kernel. The information is gathered by parsing /proc/meminfo.

$sar -n DEV 1
$sar -n TCP,ETCP 1
The  sar command writes to standard output the contents of selected cumulative activity counters in the operating system. The accounting system, based on the values in the count and interval parameters,
       writes information the specified number of times spaced at the specified intervals in seconds.  If the interval parameter is set to zero, the sar command displays the average  statistics  for  the  time
       since  the system was started. If the interval parameter is specified without the count parameter, then reports are generated continuously.  The collected data can also be saved in the file specified by
       the -o filename flag, in addition to being displayed onto the screen. If filename is omitted, sar uses the standard system activity daily data file (see below).  By default all the data  available  from
       the kernel are saved in the data file.

21 Aralık 2017 Perşembe

ActiveMQ Artemis Installation on Debian 9

This is a base installation of ActiveMQ Artemis.
I am checking cluster and fail over configuration of Artemis. When it is ready I will share on my blog.

OpenJDK of Zulu For JAVA:

$sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0x219BD9C9
$sudo apt-add-repository 'deb http://repos.azulsystems.com/debian stable main'
$sudo apt-get update
$sudo apt-get install zulu-8

More about Zulu;
https://www.azul.com/

Artemis Installation :
$wget http://ftp.itu.edu.tr/Mirror/Apache/activemq/activemq-artemis/2.4.0/apache-artemis-2.4.0-bin.tar.gz
$ sudo tar -zxvf apache-artemis-2.4.0-bin.tar.gz -C /opt/
$cd /opt

The most commonly used artemis commands are:
    address     Address tools group (create|delete|update|show) (example ./artemis address create)
    browser     It will browse messages on an instance
    consumer    It will consume messages from an instance
    create      creates a new broker instance
    data        data tools group (print) (example ./artemis data print)
    help        Display help information
    mask        mask a password and print it out
    migrate1x   Migrates the configuration of a 1.x Artemis Broker
    producer    It will send messages to an instance
    queue       Queue tools group (create|delete|update|stat) (example ./artemis queue create)

sudo ./bin/artemis create /opt/broker-name
You can now start the broker by executing:

   "/opt/broker-name/bin/artemis" run

Or you can run the broker in the background using:

   "/opt/broker-name/bin/artemis-service" start

Base Configuration of Artemis:
If you want access the web-ui from any where ,you have to change as below of the "web bind" in the <broker>/etc/bootstrap.xml.

<web bind="http://0.0.0.0:8161" path="web">
       <app url="activemq-branding" war="activemq-branding.war"/>
       <app url="artemis-plugin" war="artemis-plugin.war"/>
       <app url="console" war="console.war"/>
   </web>
If you do not set the jolokia, you can not reach the stats of artemis.
Below configuration that is enough for your access..
Jolokia settings:
<broker>/etc/jolokia-access.xml

<allow-origin>*://<ipaddressorfqdnofartemis>*</allow-origin>

Create a Systemd File for Artemis:
$sudo nano /etc/systemd/system/artemis.service

#############################################
[Unit]
Description=Apache ActiveMQ Artemis
After=network-online.target

[Service]
Type=forking
WorkingDirectory=/opt/broker-name/bin
ExecStart=/opt/broker-name/bin/artemis-service start
ExecStop=/opt/broker-name/bin/artemis-service stop
Restart=on-abort
User=root
Group=root

[Install]
WantedBy=multi-user.target
################################################

$sudo systemctl daemon-reload

Now you can start via systemd as a be service of Artemis.
$sudo systemctl start artemis.service

You can reach the web admin panel:
http://ipaddressorfqdnofartemis:8161

28 Eylül 2017 Perşembe

PowerDNS Amazon Linux Installation

Standalone PowerDns & Poweradmin sqlite Installation notes;

Repository Configuration for Amazon Linux;


$ sudo curl -o /etc/yum.repos.d/powerdns-auth-40.repo https://repo.powerdns.com/repo-files/centos-auth-40.repo
$ sudo curl -o /etc/yum.repos.d/powerdns-rec-40.repo https://repo.powerdns.com/repo-files/centos-rec-40.repo
$ sudo vi /etc/yum.repos.d/powerdns-auth-40.repo
#baseurl=http://repo.powerdns.com/centos/$basearch/$releasever/auth-40
Replace  above to bottom url
baseurl=https://repo.powerdns.com/centos/x86_64/6Server/auth-40/
$ sudo vi /etc/yum.repos.d/powerdns-rec-40.repo
#baseurl=http://repo.powerdns.com/centos/$basearch/$releasever/rec-40
Replace  above to bottom url
baseurl=https://repo.powerdns.com/centos/x86_64/6Server/rec-40/
$sudo yum update

PowerDns Installation for Amazon Linux;

$sudo yum install pdns pdns-recursor pdns-tools pdns-backend-sqlite
$sudo mv /etc/pdns/pdns.conf /etc/pdns/pdns.conf.orig
$sudo mv /etc/pdns-recursor/recursor.conf /etc/pdns-recursor/recursor.conf.orig
$sudo vi /etc/pdns/pdns.conf
launch=gsqlite3
gsqlite3-database=/etc/pdns/pdns.sqlite3
allow-axfr-ips=0.0.0.0/0
disable-axfr=no
allow-recursion=0.0.0.0/0
recursor=127.0.0.1:5353

local-address=0.0.0.0
local-port=53

$sudo vi /etc/pdns-recursor/recursor.conf
local-address=127.0.0.1
local-port=5353
allow-from=0.0.0.0/0

$sudo sqlite3 /etc/pdns/pdns.sqlite3 < /usr/share/doc/pdns/schema.sqlite3.sql
$sudo chmod 0777 /etc/pdns/
$sudo chmod 0666 /etc/pdns/pdns.sqlite3
$sudo service pdns start
$sudo service pdns-recursor start

PowerAdmin Installation for Amazon Linux;

$sudo yum install httpd php php-pdo php-mcrypt
$ tar xvfz poweradmin-2.1.7.tgz
$sudo mv poweradmin-2.1.7 /var/www/html/poweradmin
$sudo chown -R apache:apache /var/www/html/poweradmin/
$sudo service httpd start

Installation will complete via web browser

Add to startup configuration;


$sudo chkconfig pdns on
$sudo chkconfig pdns-recursor on
$sudo chkconfig httpd on
$sudo chkconfig --list