Linux ááœáẠáá±áá¬áá±á·á áºáá¬áá¬áá áºáᯠááá»áŸá±á¬áºááá·áºáá² ááœááºááœá¬ážáá±á¬á¡áá«á á¡ááŒá±á¬ááºážáááºážááᯠáááºááŸá¬ááœá±ááẠááá¯á¡ááºáááºá á¡ááŒá±á¬ááºážáááºážáá»á¬ážá áœá¬ááŸáááá¯ááºáááºá á¥ááá¬á¡á¬ážááŒááºá·, SIGSEGV â backend áá¬áá¬ááŸá bug áá áºáá¯ááŒá±á¬áá·áº áá»ááºááœááºááŒááºážá áá«áá±ááá·áº áá«á ááŸá¬ážáá«áááºá á¡áá»á¬ážá¡á¬ážááŒáá·áºá áááºááẠdisk space ááá¯á·ááá¯áẠmemory áá¯ááºáá¯á¶ážááœá¬ážáááºáááºá á¡áááºá áááºááẠdisk space áá¯ááºáá¯á¶ážááœá¬ážáá«á ááœááºáááºážáá áºáá¯áᬠááŸáááẠ- áá±áá¬ááœáẠáá¯ááºááŒá®áž áá±áá¬áá±á·á áºááᯠááŒááºáááºá áááºáá«á
ááá±á·ááá¯ááºáá±á¬ áá°áááºááá¬áž
áá¬áᬠááá¯á·ááá¯áẠáá¯ááºáááºážá ááºáá áºáá¯ááẠááŸááºáá¬ááºáá¯ááºááœá¬ážáá±á¬á¡áá«á Linux ááẠááŒá±ááŸááºážáá»áẠ2 áá¯ááᯠáá±ážáááº- á áá áºáá áºáá¯áá¯á¶ážááᯠáá»ááºá á®ážá á±ááẠááá¯á·ááá¯áẠááŸááºáá¬ááºááᯠá á¬ážáá¯á¶ážáá±ááá·áº áá¯ááºáááºážá áẠ(á¡ááºááºáá®áá±ážááŸááºáž) ááᯠáááºááá·áºá á±áááºá áá¯ááºáááºážá ááºááᯠá¡áá¯á¶ážáááºááŒá®áž OS ááᯠáá»ááºáá®ážááŒááºážá០áááºáááºááŒááºážááẠááá¯ááá¯áá±á¬ááºážááœááºáá«áááºá á¡ááá¯áá»á¯ááºá¡á¬ážááŒáá·áºá Out-Of-Memory Killer ááẠkernel áá»ááºá á®ážááŒááºážá០áááºáááºááẠá¡ááºááá®áá±ážááŸááºážááᯠáááºáá áºááá·áº áá¯ááºáááºážá ááºáá áºáá¯ááŒá áºáááºá áááºážááẠOS ááá¯áááºáááºáááºáááºá á±áááºá¡ááá®áá±ážááŸááºážááá¯á áœáá·áºááœáŸááºáááºá áŠážá áœá¬ OOM á¡áá¯ááºáá¯ááºáá¯á¶ááŸáá·áº áááºážááᯠáááºááá¯á·ááááºážáá»á¯ááºááááºááᯠááœá±ážááœá±ážááŒáá·áºááŒá áá¯á·á ááá¯á·áá±á¬áẠOOM Killer ááẠáááºááá·áº application ááᯠá¡ááŒá®ážáááºáááºááᯠáá¯á¶ážááŒááºáááºááᯠááŒáá·áºááŒáá«á áá¯á·á
Linux á á¡ááááá¬áááºáá»á¬ážáá²ááŸáá áºáá¯ááŸá¬ áááºážááá¯áá±á¬ááºážááá¯ááá·áºá¡áá« áá¯ááºáááºážá ááºáá»á¬ážáá®ááá¯á· memory ááœá²áá±áá±ážáááºááŒá áºáááºá áá¯á¶ááŸááºá¡á¬ážááŒáá·áºá áá¯ááºáááºážá áẠááá¯á·ááá¯áẠá¡ááá®áá±ážááŸááºážáá áºáá¯ááẠOS á០Memory ááᯠáá±á¬ááºážááá¯áá±á¬áºáááºáž áááºážááᯠá¡ááŒáá·áºá¡á á¡áá¯á¶ážáááŒá¯áá«á OS ááẠáááºážááá¯áá±á¬ááºážááá¯áá°ááá¯ááºážá¡á¬áž Memory áá¯ááºáá±ážáá±á¬áºáááºáž áááºážááá¯á¡áá¯á¶ážááŒá¯ááẠá¡á á®á¡á ááºáááŸááá«á áááŒá¬áá® memory áá¯ááºááœá¬ážáááºááŒá áºááŒá®áž á áá áºáá»ááºááœá¬ážáááºááŒá áºáááºá áááºážááá¯ááŸá±á¬ááºááŸá¬ážáááºá OS ááẠáá¯ááºáááºážá ááºá¡ááœáẠmemory ááᯠááááºážáááºážáá¬ážáá±á¬áºáááºáž áááºážááᯠá¡ááŸááºáááẠáá¯ááºááá±ážáá±á áá¯ááºáááºážá ááºáá áºáᯠá¡ááŸááºááááºá¡áá¯á¶ážááŒá¯ááá·áºá¡áá«ááŸáᬠMemory ááᯠááœá²áá±áá±ážáá«áááºá OS ááœáẠá¡ááá²á· memory áááŸááá±á¬áºáááºáž áááºážááẠáá¯ááºáááºážá ááºáá áºáá¯ááá¯á· Memory ááᯠáááºááŸááºáá±ážáᬠáá¯ááºáááºážá ááºáá áºáᯠááá¯á¡ááºááá·áºá¡áá«ááœáẠOS á áááºážááᯠááœá²áá±áá±ážáá«áááºá á¡á¬ážáááºážáá»ááºááŸá¬ áá áºáá«áá áºáá¶ááœáẠOS ááẠááŸááºáá¬ááºááᯠááááºážáááºážáá¬ážáá±á¬áºáááºáž á¡áá»áááºáááºáá±á¬á¡áá«ááœáẠá¡ááá²á·ááŸááºáá¬ááºáááŸááááŒáá·áº á áá áºáá»ááºááœá¬ážááŒááºážááŒá áºáááºá OOM ááẠá€á¡ááŒá±á¡áá±ááœáẠá¡áá±ážáá«áá±á¬á¡áááºážááá¹áááŸáá«áááºááŒá®áž kernel ááᯠááááºááá·áºááŒááºážá០áá¬ááœááºááẠáá¯ááºáááºážá ááºáá»á¬ážááᯠáááºááá¯ááºážáááºá PostgreSQL áá¯ááºáááºážá ááºááᯠáááºááá·áºááẠááœááºážá¡á¬ážáá±ážáá±á¬á¡áá«á ááŸááºáááºážááœáẠá á¬áá áºá á±á¬áẠáá±á«áºáá¬áááº-
Out of Memory: Killed process 12345 (postgres).
á
áá
áºááœáẠáááºááá¯áá®áááºážáá±ááŒá®áž áááºážááᯠáááœááºááá¯ááºáá«á áá¯ááºáá±á¬ááºáá»ááºááᯠáá±á«áºáááºá out_of_memory
. á€á¡ááá·áºááœááºá áá°áááœáẠáá¯ááºá
áá¬áá
áºáá¯áᬠáá»ááºáá±á¬á·áááº- áá¯ááºáááºážá
ááºáá
áºáᯠááá¯á·ááá¯áẠáá
áºáá¯áááºááá¯áá±á¬ áá¯ááºáááºážá
ááºáá»á¬ážááᯠááŒá®ážááŒá±á¬ááºá¡á±á¬áẠáá¯ááºáá±á¬ááºáá«á OOM-áá°áááºááá¬ážááẠáá¯ááºáááºážá
ááºááᯠáá»ááºáá»ááºážáááºááá·áºááá¬áž ááá¯á·ááá¯áẠá
á±á¬áá·áºááá¯ááºážááá¯ááºáá«ááá¬ážá áááºááŸá¬ážáááºááŸá¬á out_of_memory ááá¯áá±á«áºáá±á¬á¡áá«á áááºážááẠI/O áá¯ááºáá±á¬ááºáá»áẠááá¯á·ááá¯áẠdisk ááá¯á· paging ááá¯á
á±á¬áá·áºááá¯ááºážááŒááºážááŒá±á¬áá·áºááŒá
áºáááºá ááá¯á·ááŒá±á¬áá·áº OOM áá°áááºááá¬ážááẠá
á
áºáá±ážááŸá¯áá»á¬ážááᯠáŠážá
áœá¬áá¯ááºáá±á¬ááºááááºááŒá
áºááŒá®áž áááºážááá¯á·á¡áá±á«áº á¡ááŒá±áá¶á áá¯ááºáááºážá
ááºááᯠáááºá
á²ááẠááá¯á¡ááºááŒá±á¬ááºáž áá¯á¶ážááŒááºáááºá á¡á±á¬ááºáá±á¬áºááŒáá«á
á
áºáá±ážááŸá¯áá»á¬ážá¡á¬ážáá¯á¶ážááẠá¡ááŒá¯ááá±á¬áá±á¬ááºáá«áá OOM ááẠáá¯ááºáááºážá
ááºááᯠáááºááá¯ááºážáááºááŒá
áºáááºá
áá¯ááºáááºážá ááºááœá±ážáá»ááºááŒááºážá
áááºááá¯áá®áá¯ááºááœá¬ážáá±á¬á¡áá« áá¯ááºáá±á¬ááºáá»ááºááᯠáá±á«áºáááºá out_of_memory()
. áááºážááœáẠfunction áá
áºáá¯ááŸááááºá select_bad_process()
áá¯ááºáá±á¬ááºáá»ááºá០á¡áá²ááŒááºáá»ááºááᯠáááºáá¶áááŸááá±á¬á badness()
. "á¡ááá¯ážáá¯á¶áž" áá¯ááºáááºážá
ááºááᯠáá
áºááŸááºáá¬ážáááºááŒá
áºáááºá áá¯ááºáá±á¬ááºáá»áẠbadness()
á¡áá»áá¯á·áá±á¬ á
ááºážáá»ááºážáá»á¬ážá¡ááá¯ááºáž áá¯ááºáááºážá
ááºááᯠááœá±ážáá»ááºáááºá
- kernel ááẠáá°á·áá¬áá¬áá°á¡ááœáẠá¡áááá·áºáá¯á¶ážááŸááºáá¬áẠááá¯á¡ááºáááºá
- Memory ááœá± á¡áá»á¬ážááŒá®áž ááœááºááá¯á· ááá¯áá«áááºá
- Memory á¡áááºážáááºááᯠá¡áá¯á¶ážááŒá¯ááá·áº áá¯ááºáááºážá ááºáá»á¬ážááᯠáááºááá·áºááẠáááá¯á¡ááºáá«á
- á¡áááºážáá¯á¶áž áá¯ááºáááºážá ááºáá»á¬áž ááŒá®ážááŒá±á¬ááºááẠááá¯á¡ááºáááºá
- á¡áá¯á¶ážááŒá¯áá°ááá¯ááºááá¯áẠááŒá®ážááŒá±á¬ááºááá¯áá±á¬ áá¯ááºáááºážá ááºáá»á¬ážá¡ááœáẠááŒá®ážááŒá±á¬ááºááẠá¡ááœáá·áºá¡áááºážááᯠááá¯ážá á±ááá·áº ááŸá¯ááºááœá±ážáá±á¬ á¡ááºáááá¯áá®áááºáá»á¬ážá
á€á
á
áºáá±ážááŸá¯áá»á¬ážá¡á¬ážáá¯á¶ážááᯠááŒá®ážá
á®ážááŒá®ážáá±á¬áẠOOM ááẠáááŸááºááᯠá
á
áºáá±ážááẠ(oom_score
) OOM á០ááá·áºá¡ááºáááºá oom_score
áá¯ááºáááºážá
ááºáá
áºáá¯á
á®á ááá¯á·áá±á¬áẠá€áááºááá¯ážááᯠmemory ááá¬áááŒáá·áº ááŒáŸá±á¬ááºáá«á ááá¯ááŒá®ážáá±á¬áááºááá¯ážáá»á¬ážááŸááá±á¬ áá¯ááºáááºážá
ááºáá»á¬ážááẠOOM Killer á áá¬ážáá±á¬ááºááŒá
áºááá¯ááºáá»á±ááá¯áá»á¬ážáááºá á¡ááŒá
áºá¡áá¯á¶ážááŒá¯áá°ááŸáá·áº áááºá
ááºááá·áº áá¯ááºáááºážá
ááºáá»á¬ážááẠáááŸááºáááºážáá«ážááŒá®áž áááºá
á²ááẠá¡áá¬ážá¡áá¬áááºážáá«áááºá
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)
Postgres áá¯ááºáááºážá
áẠID ááẠ3813 ááŒá
áºáá±á¬ááŒá±á¬áá·áº á¡ááŒá¬áž shell ááœáẠဠkernel parameter ááᯠá¡áá¯á¶ážááŒá¯á áááŸááºáááá¯ááºááẠoom_score
:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2
á¡áááºá áááºááẠOOM-Killer áá¯ááºáááºážá
ááºááᯠáá¯á¶ážáááááºá
á±áá»ááºáá«áá á¡ááŒá¬áž kernel ááœá±ážáá»ááºááœáá·áºááŸááá«áááº- oom_score_adj
. áááºáááºááá¯ážáá¬ážáá±á¬ áá¯ááºáááºážá
ááºááᯠááŒá®ážááŒá±á¬ááºááẠá¡ááœáá·áºá¡áááºážáá»á¬ážááᯠáá»áŸá±á¬á·áá»ááẠááŒá®ážáá¬ážáá±á¬ á¡áá¯ááºáááºááá¯ážááᯠááá·áºáá«á
sudo echo -100 > /proc/3813/oom_score_adj
áááºááá¯ážáá
áºáá¯áááºááŸááºááẠoom_score_adj
áááºáá±á¬ááºááŸá¯ááá±á¬ááºááœáẠOOMScoreAdjust ááᯠáááºááŸááºáá«-
[Service]
OOMScoreAdjust=-1000
ááá¯á·ááá¯áẠáá¯á¶ážáá«á oomprotect
á¡ááœá²á·áá²ááŸá¬ rcctl
.
rcctl set <i>servicename</i> oomprotect -1000
áá¯ááºáááºážá ááºáá áºáá¯á¡á¬áž á¡áááºážá¡ááŒááºáááºá á²ááŒááºážá
áá
áºáᯠááá¯á·ááá¯áẠáá
áºáá¯áááºááá¯áá±á¬ áá¯ááºáááºážá
ááºáá»á¬ážááᯠááœá±ážáá»ááºááŒá®ážáá±á¬á¡áá«á OOM-Killer ááẠáá¯ááºáá±á¬ááºáá»ááºááᯠáá±á«áºááá¯áááºá oom_kill_task()
. á€áá¯ááºáá±á¬ááºáá»ááºááẠáá¯ááºáááºážá
ááºááá¯á· áááºá
á²á¡áá»ááºááŒááŸá¯áá
áºáᯠáá±ážááá¯á·áááºá ááŸááºáá¬ááºááŒááºáááºááŸá¯á¡ááŒá±á¡áá±ááœáẠoom_kill()
áá¯ááºáááºážá
ááºááá¯á· SIGKILL á¡áá»ááºááŒááŸá¯ áá±ážááá¯á·ááẠá€áá¯ááºáá±á¬ááºáá»ááºááᯠáá±á«áºááá¯áááºá kernel ááŸááºáááºážááá¯á· á
á¬áá
áºá
á±á¬ááºáá±ážáá¬ážáááºá
Out of Memory: Killed process [pid] [name].
OOM-Killer ááᯠáááºááá¯ááááºážáá»á¯ááºááá²á
Linux ááœáẠáááºááẠOOM-Killer ááᯠááœáá·áºááá¯ááºááẠááá¯á·ááá¯áẠááááºááá¯ááºááẠ(áá±á¬ááºááá¯ááºážááœáẠá¡ááŒá¶ááŒá¯áá¬ážááŒááºáž áááŸááá±á¬áºáááºáž)á ááœáá·áºááẠááá¯á·ááá¯áẠááááºááẠáá«áá¬áá®áá¬ááᯠá¡áá¯á¶ážááŒá¯áá«á vm.oom-kill
. runtime ááœáẠOOM-Killer ááá¯ááœáá·áºáááºá command ááá¯ááœáá·áºáá«á sysctl
.
sudo -s sysctl -w vm.oom-kill = 1
OOM-Killer ááᯠááááºáááºá áá°áá®áá±á¬ command ááŒáá·áº áááºááá¯áž 0 ááᯠáááºááŸááºáá«-
sudo -s sysctl -w vm.oom-kill = 0
á€á¡áááá·áºáá±á¬áºáááááºááẠáá¬ááááááºážáááºážáááºááá¯ááºáá±á¬áºáááºáž ááááá¯á¶ážááŒááºáááºá
áááºááá·áºá¡áá»áááºá¡áááá¬á áááºáááºáááºáá¶á·ááẠááá¯á¡ááºáá«á á€á
á¬ááŒá±á¬ááºážááᯠááá¯ááºááœáẠááá·áºáá«á /etc/sysctl.conf
:
echo vm.oom-kill = 1 >>/etc/sysctl.conf
enable ááŸáá·áº disable áááºá¡ááŒá¬ážáááºážáááºážááŸá¬ variable áá±ážáááºááŒá
áºáááºá panic_on_oom
. áááºááá¯ážááᯠá¡ááŒá²áááºáž check in áá¯ááºááá¯ááºáá«áááºá /proc
.
$ cat /proc/sys/vm/panic_on_oom
0
á¡áááºá áááºááẠáááºááá¯ážááᯠ0 áᯠáááºááŸááºáá«áá ááá¯á·áá±á¬áẠmemory áá¯ááºááœá¬ážáá±á¬á¡áá«á kernel á¡ááááºáááá·áºááŒá áºááẠááá¯ááºáá«á
$ echo 0 > /proc/sys/vm/panic_on_oom
á¡áááºá áááºááẠáááºááá¯ážááᯠ1 áá¯áááºááŸááºáá«áá ááá¯á·áá±á¬áẠmemory áá¯ááºááœá¬ážáá±á¬á¡áá«á kernel á¡ááááºáááá·áºááŒá áºááœá¬ážáááá·áºáááºá
echo 1 > /proc/sys/vm/panic_on_oom
OOM-Killer ááẠá¡ááœáá·áºá¡ááááºáá¯ááºáá¯á¶áá¬áááá«á Linux ááẠáááºážááᯠá¡ááŸááºááááºááœá²áá±áá±ážááŒááºážáááŸááá² áááŸááááºááẠáá¯ááºáááºážá
ááºáá»á¬ážá¡ááœáẠááŸááºáá¬ááºááá¯ááá¯ááá¯ááŸá±á¬ááºáá¬ážááá¯ááºáááºáᯠáá»áœááºá¯ááºááá¯á·ááŒá±á¬áá¬ážááŒá®ážáá¬ážááŒá
áºááŒá®áž á€á¡ááŒá¯á¡áá°ááᯠLinux kernel ááá·áºáááºáá±á¬ááºáá
áºáá¯á ááááºážáá»á¯ááºáá¬ážáááºá áá®á¡ááœáẠvariable á áá¬áááºááŸááá«áááºá vm.overcommit_memory
.
áááºážá¡ááœáẠá¡á±á¬ááºáá«áááºááá¯ážáá»á¬ážááᯠáááºáááºááŸááºááá¯ááºáá«áááºá
0: kernel ááá¯ááºááá¯ááºá memory áá»á¬ážááœááºážááŒááºážááŸáááááŸá áá¯á¶ážááŒááºáááºá áááºážááẠLinux áá¬ážááŸááºážá¡áá»á¬ážá
á¯ááœáẠáá°áááºážááŒá
áºáááºá
1: kernel ááẠá¡ááá¯ááŸááºáá¬ááºááᯠá¡ááŒá²ááááºážáááºážáá¬ážáááºááŒá
áºáááºá áááºááá¯áá®áá¯ááºááœá¬ážááŒááºážááŒá±á¬áá·áº ááŒá
áºááá¯ááºáá»á± áá»á¬ážáá±á¬ááŒá±á¬áá·áºá áá¯ááºáááºážá
ááºáá»á¬ážááẠáá
áºáá±á·ááœáẠáááºážááᯠááá¯á¡ááºáááºááŒá
áºáááŒáá·áº á¡áá¹ááá¬ááºáá»á¬ážáá«áááºá
2: kernel ááẠparameter ááœááºáááºááŸááºáá¬ážáá±á¬ááŸááºáá¬ááºáááºááá¯ááá¯ááá¯ááŸá±á¬ááºáááºááá¯ááºáá«á overcommit_ratio
.
á€ááá·áºáááºáá»ááºááŒáá·áºá áááºááẠover-reserved áá¯ááºááœáá·áºááŒá¯áá¬ážáá±á¬ memory áá¬ááá¯ááºááŸá¯ááºážááᯠáááºááŸááºáá±ážáááºá áááºážá¡ááœáẠáá±áá¬áááŸááá«áá áááºááá¯áá®ááᯠááœá²áá±áá±ážáááºááá¯ááºááá·áºá¡ááŒáẠááŒáá¯áááºááŸá¬áá°ááŸá¯ááᯠááŒááºážáááºáááºááŒá
áºáááºá á€áááºááŸá¬ PostgreSQL á¡ááœáẠá¡áá¯á¶ááŒá¯á¶áá¯á¶ážááœá±ážáá»ááºááŸá¯ááŒá
áºáááºá OOM-Killer ááẠvariable ááŸááááºážáá»á¯ááºáá¬ážááá·áº á¡ááŒá¬ážááŒááºá
ááºáá
áºáá¯ááŒá
áºááá·áº áá²ááŸááºááá¯ááºááŸá¯á¡á¬áž áááºáá±á¬ááºááŸá¯ááŸááááºá cat /proc/sys/vm/swappiness
. á€áááºááá¯ážáá»á¬ážááẠkernel á á
á¬áá»ááºááŸá¬ááᯠáááºááá¯á·ááá¯ááºááœááºááááºááᯠááŒá±á¬ááŒáááºá áááºááá¯ážááŒáá·áºáá±á OOM ááẠáá¯ááºáááºážá
ááºááᯠáááºá
á²ááẠááŒá
áºááá¯ááºááŒá±áááºážáá±á¬áºáááºáž I/O áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááŒá±á¬áá·áº database áá±á«áºááœáẠá¡áá»ááºááá±á¬áá±á¬ááºáá±á¬ áááºáá±á¬ááºááŸá¯ááŸááááºá á¡ááŒááºá¡ááŸááºá¡á¬ážááŒáá·áº - áááºááá¯ážáááá·áºáá±á OOM-Killer á
áœááºáááºááŸá¯ ááŒá
áºááá¯ááºááŒá± ááŒáá·áºáá¬ážáá±á ááá¯á·áá±á¬áº áá±áá¬áá±á·á
áºá á
áœááºážáá±á¬ááºáááºááŸá¬áááºáž ááá¯ááŒáá·áºáá«áááºá áá°áááºážáááºááá¯ážááẠ60 ááŒá
áºáá±á¬áºáááºáž áá±áá¬áá±á·á
áºáá
áºáá¯áá¯á¶ážááẠááŸááºáá¬ááºááœáẠá¡á¶áááºááœááºáá»ááŒá
áºáá±áá«á áááºááá¯ážááᯠ1 áᯠáááºááŸááºááŒááºážááẠááá¯áá±á¬ááºážáááºá
ááááºáá»á¬ážááá¯
OOM-Killer áá²á "áá°áááºááá¬áž" á ááá·áºááᯠáááŒá±á¬ááºáá«á
á±áá²á·á á€ááá
á¹á
ááœááºá áá°áááºááá¬ážááẠááá·áºá
áá
áºá áááºáááºááŸááºááŒá
áºáááá·áºáááºá áááºážááẠá¡ááá¯ážááœá¬ážáá¯á¶áž áá¯ááºáááºážá
ááºáá»á¬ážááᯠâáááºâ ááŒá®áž á
áá
áºáá»ááºáá»ááŒááºážá០áááºáááºáááºá PostgreSQL ááá¯á¡áá¯á¶ážáááºááẠOOM-Killer ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááŸááŸá±á¬ááºááŒááºáááºá áááºááŸááºáá¬ážáááºá vm.overcommit_memory
áááºááá¯áž 2. áááºážááẠOOM-Killer ááẠáááºáá±á¬ááºá
áœááºáááºááẠáááá¯á¡ááºááŒá±á¬ááºáž á¡á¬áááá¶ááá¯ááºáá±á¬áºáááºážá áááºážááẠPostgreSQL áá¯ááºáááºážá
ááºááᯠáááºááá·áºááẠááœááºážá¡á¬ážáá±ážááá·áº ááŒá
áºááá¯ááºááŒá±ááᯠáá»áŸá±á¬á·áá»áá±ážáááºááŒá
áºáááºá
source: www.habr.com