PostgreSQL ã®æé©ãªããã©ãŒãã³ã¹ã¯ãæ£ããå®çŸ©ããããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãã©ã¡ãŒã¿ã«äŸåããŸãã OS ã«ãŒãã«èšå®ãé©åã«æ§æãããŠããªããšãããŒã¿ããŒã¹ ãµãŒããŒã®ããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸãã ãããã£ãŠããããã®èšå®ãããŒã¿ããŒã¹ ãµãŒããŒãšãã®ã¯ãŒã¯ããŒãã«å¿ããŠæ§æããããšãäžå¯æ¬ ã§ãã ãã®èšäºã§ã¯ãããŒã¿ããŒã¹ ãµãŒããŒã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ãããããã€ãã®éèŠãª Linux ã«ãŒãã« ãã©ã¡ãŒã¿ãŒãšãã®æ§ææ¹æ³ã«ã€ããŠèª¬æããŸãã
SHMMAX / SHMALL
SHMMAX Linux ããã»ã¹ãå²ãåœãŠãããšãã§ããåäžã®å ±æã¡ã¢ãª ã»ã°ã¡ã³ãã®æ倧ãµã€ãºã決å®ããããã«äœ¿çšãããã«ãŒãã« ãã©ã¡ãŒã¿ã§ãã ããŒãžã§ã³ 9.2 ããåã® PostgreSQL ã§ã¯ãSHMMAX èšå®ãå¿ èŠãª System V (SysV) ã䜿çšãããŠããŸããã 9.2 以éãPostgreSQL 㯠POSIX å ±æã¡ã¢ãªã«åãæ¿ãããŸããã ãã®ãããå¿ èŠãª System V å ±æã¡ã¢ãªã®ãã€ãæ°ãæžããŸããã
ããŒãžã§ã³ 9.3 ããåã¯ãSHMMAX ãæãéèŠãªã«ãŒãã« ãã©ã¡ãŒã¿ã§ããã SHMMAX å€ã¯ãã€ãåäœã§æå®ããŸãã
åæ§ã« ã·ã¥ã¢ãŒã« ã決å®ããããã«äœ¿çšãããå¥ã®ã«ãŒãã«ãã©ã¡ãŒã¿ã§ãã
ã·ã¹ãã å
šäœã®å
±æã¡ã¢ãª ããŒãžã®ããªã¥ãŒã ã çŸåšã® SHMMAXãSHMALLããŸã㯠SHMMIN å€ã衚瀺ããã«ã¯ã次ã®ã³ãã³ãã䜿çšããŸãã ipcs.
SHM* 詳现 - Linux
$ ipcs -lm
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 1073741824
max total shared memory (kbytes) = 17179869184
min seg size (bytes) = 1
SHM* 詳现 - MacOS X
$ ipcs -M
IPC status from as of Thu Aug 16 22:20:35 PKT 2018
shminfo:
shmmax: 16777216 (max shared memory segment size)
shmmin: 1 (min shared memory segment size)
shmmni: 32 (max number of shared memory identifiers)
shmseg: 8 (max shared memory segments per process)
shmall: 1024 (max amount of shared memory in pages)
PostgreSQL ã䜿çšãããã® System VIPC å ±æã¡ã¢ãªãå²ãåœãŠãŸãã ãã®ãã©ã¡ãŒã¿ã¯ãæãéèŠãªã«ãŒãã« ãã©ã¡ãŒã¿ã® XNUMX ã€ã§ãã 次ã®ãšã©ãŒ ã¡ãã»ãŒãžã衚瀺ãããå Žåã¯ãå€ãããŒãžã§ã³ã® PostgreSQL ã䜿çšãããŠãããSHMMAX å€ãéåžžã«äœãããšãæå³ããŸãã ãŠãŒã¶ãŒã¯ã䜿çšããå ±æã¡ã¢ãªã«å¿ããŠå€ã調æŽããã³å¢å ããããšãæåŸ ãããŸãã
æ§æãã¹ã®å¯èœæ§ããããšã©ãŒ
SHMMAX ãæ£ããæ§æãããŠããªãå Žåã次ã®ã³ãã³ãã䜿çšã㊠PostgreSQL ã¯ã©ã¹ã¿ãŒãåæåããããšãããšããšã©ãŒãçºçããå¯èœæ§ããããŸãã initdb.
initdb ã®å€±æ
DETAIL: Failed system call was shmget(key=1, size=2072576, 03600).
HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter.
You can either reduce the request size or reconfigure the kernel with larger SHMMAX. To reduce the request size (currently 2072576 bytes),
reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.
If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter,
in which case raising the request size or reconfiguring SHMMIN is called for.
The PostgreSQL documentation contains more information about shared memory configuration. child process exited with exit code 1
åæ§ã«ã次ã®ã³ãã³ãã䜿çšã㊠PostgreSQL ãµãŒããŒãèµ·åãããšããšã©ãŒãçºçããå ŽåããããŸãã pg_ctl.
pg_ctl ã®å€±æ
DETAIL: Failed system call was shmget(key=5432001, size=14385152, 03600).
HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter.
You can either reduce the request size or reconfigure the kernel with larger SHMMAX.; To reduce the request size (currently 14385152 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.
If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter,
in which case raising the request size or reconfiguring SHMMIN is called for.
The PostgreSQL documentation contains more information about shared memory configuration.
å®çŸ©ã®éããç解ãã
SHMMAX/SHMALL ãã©ã¡ãŒã¿ã®å®çŸ©ã¯ãLinux ãš MacOS X ã§ã¯è¥å¹²ç°ãªããŸãã
- Linux: kernel.shmmaxãkernel.shmall
- MacOS X: kern.sysv.shmmaxãkern.sysv.shmall
ããŒã sysctl å€ãäžæçã«å€æŽããããã«äœ¿çšã§ããŸãã å®æ°å€ãèšå®ããã«ã¯ããšã³ããªãè¿œå ããŸãã /etc/sysctl.confã 詳现ã¯ä»¥äžã®éãã§ãã
MacOS X ã§ã®ã«ãŒãã«èšå®ã®å€æŽ
# Get the value of SHMMAX
sudo sysctl kern.sysv.shmmax
kern.sysv.shmmax: 4096
# Get the value of SHMALL
sudo sysctl kern.sysv.shmall
kern.sysv.shmall: 4096
# Set the value of SHMMAX
sudo sysctl -w kern.sysv.shmmax=16777216
kern.sysv.shmmax: 4096 -> 16777216
# Set the value of SHMALL
sudo sysctl -w kern.sysv.shmall=16777216
kern.sysv.shmall: 4096 -> 16777216
Linux ã§ã®ã«ãŒãã«ãã©ã¡ãŒã¿ã®å€æŽ
# Get the value of SHMMAX
sudo sysctl kernel.shmmax
kernel.shmmax: 4096
# Get the value of SHMALL
sudo sysctl kernel.shmall
kernel.shmall: 4096
# Set the value of SHMMAX
sudo sysctl -w kernel.shmmax=16777216
kernel.shmmax: 4096 -> 16777216
# Set the value of SHMALL
sudo sysctl -w kernel.shmall=16777216
kernel.shmall: 4096 -> 16777216
å¿ããªãã§ãã ãã: å€æŽãæ°žç¶çã«ããã«ã¯ããããã®å€ã /etc/sysctl.conf ã«è¿œå ããŸãã
巚倧ãªããŒãž
Linux ã¯ããã©ã«ã㧠4 KB ã¡ã¢ãª ããŒãžã䜿çšããBSD 㯠XNUMX KB ã¡ã¢ãª ããŒãžã䜿çšããŸãã ã¹ãŒããŒããŒãžãWindows ã§ã¯ - 倧ããªããŒãžã ããŒãžã¯ãããã»ã¹ã«å²ãåœãŠããã RAM ã®äžéšã§ãã ã¡ã¢ãªèŠä»¶ã«å¿ããŠãããã»ã¹ã«ã¯è€æ°ã®ããŒãžãå«ãŸããå ŽåããããŸãã ããã»ã¹ãå¿ èŠãšããã¡ã¢ãªãå¢ããã»ã©ãããå€ãã®ããŒãžãå²ãåœãŠãããŸãã OS ã¯ããã»ã¹ã®ããŒãžå²ãåœãŠããŒãã«ãç¶æããŸãã ããŒãž ãµã€ãºãå°ãããªãã»ã©ãããŒãã«ã倧ãããªãããã®ããŒãž ããŒãã«å ã§ããŒãžãèŠã€ããã®ã«æéãããããŸãã ãããã£ãŠã倧ããªããŒãžã䜿çšãããšããªãŒããŒããããåæžããªãã倧éã®ã¡ã¢ãªã䜿çšã§ããããã«ãªããŸãã ããŒãžãã¥ãŒãæžããããŒãžãã©ãŒã«ããæžãããã倧ããªãããã¡äžã§ã®èªã¿åã/æžã蟌ã¿æäœãé«éåãããŸãã ãã®çµæãããã©ãŒãã³ã¹ãåäžããŸãã
PostgreSQL 㯠Linux äžã®ã©ãŒãž ããŒãžã®ã¿ããµããŒãããŸãã Linux ã¯ããã©ã«ã㧠4 KB ã®ã¡ã¢ãª ããŒãžã䜿çšãããããã¡ã¢ãªæäœãå€ãããå Žåã¯ããã倧ããªããŒãžãèšå®ããå¿ èŠããããŸãã 2 MB ããæ倧 1 GB ãŸã§ã®å€§ããªããŒãžã䜿çšãããšãããã©ãŒãã³ã¹ã®åäžãèŠãããŸãã 倧ããããŒãž ãµã€ãºã¯ããŒãæã«èšå®ã§ããŸãã 次ã®ã³ãã³ãã䜿çšãããšãLinux ãã·ã³äžã§ã©ãŒãž ããŒãž ãã©ã¡ãŒã¿ãšãã®äœ¿çšç¶æ³ãç°¡åã«ç¢ºèªã§ããŸãã ç« /proc/meminfo | grep -i 巚倧ã§ã.
倧ããªããŒãžã«é¢ããæ å ±ã®ååŸ (Linux ã®ã¿)
Note: This is only for Linux, for other OS this operation is ignored$ cat /proc/meminfo | grep -i huge
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
ãã®äŸã§ã¯ãã©ãŒãž ããŒãžã®ãµã€ãºã¯ 2048 (2 MB) ã«èšå®ãããŠããŸãããã©ãŒãž ããŒãžã®ç·æ°ã¯ 0 ã«èšå®ãããŠããŸããããã¯ãã©ãŒãž ããŒãžãç¡å¹ã«ãªã£ãŠããããšãæå³ããŸãã
倧ããªããŒãžã®æ°ã決å®ããããã®ã¹ã¯ãªãã
ãã®åçŽãªã¹ã¯ãªããã¯ãå¿ èŠãªæ°ã®ã©ãŒãž ããŒãžãè¿ããŸãã PostgreSQL ã®å®è¡äžã« Linux ãµãŒããŒã§ã¹ã¯ãªãããå®è¡ããŸãã ç°å¢å€æ°ã次ã§ããããšã確èªããŠãã ãã $PGDATA PostgreSQLããŒã¿ãã£ã¬ã¯ããªãæå®ããŸãã
å¿ èŠãªã©ãŒãžããŒãžã®æ°ãååŸãã
#!/bin/bash
pid=`head -1 $PGDATA/postmaster.pid`
echo "Pid: $pid"
peak=`grep ^VmPeak /proc/$pid/status | awk '{ print $2 }'`
echo "VmPeak: $peak kB"
hps=`grep ^Hugepagesize /proc/meminfo | awk '{ print $2 }'`
echo "Hugepagesize: $hps kB"
hp=$((peak/hps))
echo Set Huge Pages: $hp
ã¹ã¯ãªããã®åºåã¯æ¬¡ã®ããã«ãªããŸãã
ã¹ã¯ãªããåºå
Pid: 12737
VmPeak: 180932 kB
Hugepagesize: 2048 kB
Set Huge Pages: 88
倧ããªããŒãžã®æšå¥šå€ã¯ 88 ãªã®ã§ã88 ã«èšå®ããå¿ èŠããããŸãã
倧ããªããŒãžã®ã€ã³ã¹ããŒã«
sysctl -w vm.nr_hugepages=88
ããã§ã©ãŒãž ããŒãžã確èªãããšãã©ãŒãž ããŒãžã䜿çšãããŠããªãããšãããããŸã (HugePages_Free = HugePages_Total)ã
倧ããªããŒãžã®åè (Linux ã®ã¿)
$ cat /proc/meminfo | grep -i huge
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
HugePages_Total: 88
HugePages_Free: 88
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
次ã«ã$PGDATA/postgresql.conf 㧠huge_pages ãã©ã¡ãŒã¿ããonãã«èšå®ãããµãŒããŒãåèµ·åããŸãã
ããäžåºŠãã©ãŒãž ããŒãžã«é¢ããæ å ± (Linux ã®ã¿)
$ cat /proc/meminfo | grep -i huge
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
HugePages_Total: 88
HugePages_Free: 81
HugePages_Rsvd: 64
HugePages_Surp: 0
Hugepagesize: 2048 kB
ããã§ã倧ããªããŒãžãã»ãšãã©äœ¿çšãããŠããªãããšãããããŸãã 次ã«ãããŒã¿ããŒã¹ã«ããŒã¿ãè¿œå ããŠã¿ãŸãããã
倧ããªããŒãžããªãµã€ã¯ã«ããããã®äžéšã®ããŒã¿ããŒã¹æäœ
postgres=# CREATE TABLE foo(a INTEGER);
CREATE TABLE
postgres=# INSERT INTO foo VALUES(generate_Series(1,10000000));
INSERT 0 10000000
以åãããå€ãã®å€§ããªããŒãžã䜿çšããŠãããã©ãããèŠãŠã¿ãŸãããã
詳现ã«ã€ããŠã¯å€§ããªããŒãžãã芧ãã ãã (Linux ã®ã¿)
$ cat /proc/meminfo | grep -i huge
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
HugePages_Total: 88
HugePages_Free: 18
HugePages_Rsvd: 1
HugePages_Surp: 0
Hugepagesize: 2048 kB
ããã§ã倧ããªããŒãžã®ã»ãšãã©ã䜿çšãããŠããããšãããããŸãã
泚: ããã§äœ¿çšãããŠãã HugePages ã®æšå®å€ã¯éåžžã«äœãã補åç°å¢ãå®è¡ããŠãããã·ã³ã®éåžžã®å€ã§ã¯ãããŸããã ã·ã¹ãã ã«å¿ èŠãªããŒãžæ°ãèŠç©ãããè² è·ãšãªãœãŒã¹ã«åºã¥ããŠé©åã«èšå®ããŠãã ããã
vm.swappiness
vm.swappiness ããã¯ãããŒã¿ããŒã¹ã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããã 0 ã€ã®ã«ãŒãã« ãã©ã¡ãŒã¿ã§ãã ãã®ãªãã·ã§ã³ã¯ãLinux ã§ã®ã¹ã¯ãããã¹ (ã¡ã¢ãªå ããã³ã¡ã¢ãªå€ã®ããŒãžã®ã¹ã¯ãã) ã®åäœãå¶åŸ¡ããããã«äœ¿çšãããŸãã å€ã®ç¯å²ã¯ 100 ïœ 100 ã§ããããŒãžã³ã°ãŸãã¯ããŒãžã¢ãŠããããã¡ã¢ãªã®éã決ãŸããŸãã XNUMX ã¯äº€æãªããæå³ããXNUMX ã¯ç©æ¥µçãªäº€æãæå³ããŸãã
ããäœãå€ãèšå®ãããšãè¯å¥œãªããã©ãŒãã³ã¹ãåŸãããŸãã
æ°ããã«ãŒãã«ã§ããã 0 ã«èšå®ãããšãOOM Killer (Linux ã®ã¡ã¢ãª ã¯ãªãŒãã³ã° ããã»ã¹) ã«ãã£ãŠããã»ã¹ã匷å¶çµäºãããå¯èœæ§ããããŸãã ãããã£ãŠãã¹ã¯ãããæå°éã«æãããå Žåã¯ã1 ã«èšå®ããã®ãå®å šã§ãã Linux ã®ããã©ã«ãå€ã¯ 60 ã§ããå€ã倧ããã»ã©ãMMU (ã¡ã¢ãªç®¡çãŠããã) 㯠RAM ãããå€ãã®ã¹ã¯ããé åã䜿çšããå€ãå°ããã»ã©ãããå€ãã®ããŒã¿/ã³ãŒããã¡ã¢ãªå ã«ä¿æããŸãã
PostgreSQL ã®ããã©ãŒãã³ã¹ãåäžããã«ã¯ãå€ãäœãããããšããå§ãããŸãã
vm.overcommit_memory / vm.overcommit_ratio
ã¢ããªã±ãŒã·ã§ã³ã¯ã¡ã¢ãªãååŸããäžèŠã«ãªã£ããã¡ã¢ãªã解æŸããŸãã ãã ããå Žåã«ãã£ãŠã¯ãã¢ããªã±ãŒã·ã§ã³ãéå°ãªã¡ã¢ãªãååŸããããã解æŸããªãããšããããŸãã ããã«ãããOOM ãã©ãŒãçºçããå¯èœæ§ããããŸãã å¯èœãªãã©ã¡ãŒã¿å€ã¯æ¬¡ã®ãšããã§ã vm.overcommit_memory ããããã®èª¬æä»ã:
- ãã¥ãŒãªã¹ãã£ãã¯ãªãªãŒããŒã³ããã (ããã©ã«ã)ã ã«ãŒãã«ããŒã¹ã®ãã¥ãŒãªã¹ãã£ãã¯
- ãšã«ãããªãŒããŒã³ããããèš±å¯ãã
- ããããããããªãŒããŒã³ãããçãè¶ ãããããªãã§ãã ããã
åèïŒ
vm.overcommit_ratio â éè² è·ã«å©çšå¯èœãª RAM ã®å²åã 50 GB ã® RAM ãæèŒããã·ã¹ãã 㧠2% ã®å€ãæå®ãããšãæ倧 3 GB ã® RAM ãå²ãåœãŠãããšãã§ããŸãã
vm.overcommit_memory ã®å€ã 2 ã«ãããšãPostgreSQL ã®ããã©ãŒãã³ã¹ãåäžããŸãã ãã®å€ã«ãããOOM ãã©ãŒ ããã»ã¹ã«ãã£ãŠåŒ·å¶çµäºãããé倧ãªãªã¹ã¯ãè² ãããšãªãããµãŒã㌠ããã»ã¹ã® RAM 䜿çšéãæ倧åãããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯ãªãŒããŒã©ã³ã®å¶éå ã§ã®ã¿åããŒãã§ããŸããããã«ãããOOM ãã©ãŒã«ãã£ãŠããã»ã¹ã匷å¶çµäºããããªã¹ã¯ã軜æžãããŸãã ãããã£ãŠãå€ 2 ãæå®ãããšãããã©ã«ãå€ã® 0 ãããããã©ãŒãã³ã¹ãåäžããŸãããã ããç¯å²å€ã®ã¡ã¢ãªãéè² è·ã«ãªããªãããã«ããããšã§ãä¿¡é Œæ§ãåäžãããããšãã§ããŸãã ããã«ãããOOM ãã©ãŒã«ãã£ãŠããã»ã¹ã匷å¶çµäºããããªã¹ã¯ãæé€ãããŸãã
ã¹ã¯ããã®ãªãã·ã¹ãã ã§ã¯ãvm.overcommit_memory ã 2 ã«çãããšããåé¡ãçºçããå¯èœæ§ããããŸãã
vm.dirty_background_ratio / vm.dirty_background_bytes
vm.dirty_background_ratio ãã£ã¹ã¯ã«æžã蟌ãå¿ èŠãããããŒã㣠ããŒãžã§æºããããŠããã¡ã¢ãªã®å²åã§ãã ãã£ã¹ã¯ãžã®ãã©ãã·ã¥ã¯ããã¯ã°ã©ãŠã³ãã§è¡ãããŸãã ãã®ãã©ã¡ãŒã¿ã®å€ã®ç¯å²ã¯ 0 ïœ 100 ã§ãã ãã ãã5 æªæºã®å€ã¯å¹æããªãå¯èœæ§ããããäžéšã®ã«ãŒãã«ã¯ããããµããŒãããŠããŸããã ã»ãšãã©ã® Linux ã·ã¹ãã ã§ã¯ 10 ãããã©ã«ãã§ãã æžã蟌ã¿éäžåã®æäœã®ããã©ãŒãã³ã¹ãããå°ããä¿æ°ã§åäžãããããšãã§ããŸããããã¯ãLinux ãããã¯ã°ã©ãŠã³ãã§ããŒã㣠ããŒãžããã©ãã·ã¥ããããšãæå³ããŸãã
å€ãèšå®ããå¿ èŠããããŸã vm.dirty_background_bytes ãã©ã€ãã®é床ã«ãã£ãŠç°ãªããŸãã
ããã 5 ã€ã®ãã©ã¡ãŒã¿ã¯ã©ã¡ããããŒããŠã§ã¢ã«äŸåããããããé©åãªãå€ã¯ãããŸããã ãã ããvm.dirty_background_ratio ã 25 ã«èšå®ããvm.dirty_background_bytes ããã£ã¹ã¯é床㮠25% ã«èšå®ãããšãã»ãšãã©ã®å Žåãããã©ãŒãã³ã¹ãæ倧 XNUMX% åäžããŸãã
vm.dirty_ratio/dirty_bytes
ãããšåãã§ã vm.dirty_background_ratio/dirty_background_bytesãã ãããªã»ãããã¯ãŒã«ãŒ ã»ãã·ã§ã³ã§å®è¡ãããã¢ããªã±ãŒã·ã§ã³ããããã¯ãããç¹ãç°ãªããŸãã ãããã£ãŠãvm.dirty_ratio 㯠vm.dirty_background_ratioã ããã«ãããããã¯ã°ã©ãŠã³ã ããã»ã¹ãããæ©ãéå§ãããã¢ããªã±ãŒã·ã§ã³ã®ãããã¯ãå¯èœãªéãåé¿ãããŸãã ãã£ã¹ã¯ I/O è² è·ã«å¿ããŠãããã XNUMX ã€ã®æ¯çã®å·®ã調æŽã§ããŸãã
åèš
ä»ã®èšå®ã調æŽããŠããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãããæ¹åã¯æå°éã§ãããããŸãã¡ãªããã¯èŠãããŸããã ãã¹ãŠã®ãªãã·ã§ã³ããã¹ãŠã®çš®é¡ã®ã¢ããªã±ãŒã·ã§ã³ã«é©çšãããããã§ã¯ãªãããšã«æ³šæããå¿
èŠããããŸãã äžéšã®ã¢ããªã¯ãèšå®ã調æŽãããšããé©åã«åäœãããã®ãšãããã§ãªããã®ããããŸãã äºæ³ãããã¯ãŒã¯ããŒããšã¢ããªã±ãŒã·ã§ã³ã®çš®é¡ã«åãããŠãããã®èšå®ãæ§æããéã®é©åãªãã©ã³ã¹ãèŠã€ããå¿
èŠãããããã¥ãŒãã³ã°ããéã«ã¯ OS ã®åäœãèæ
®ããå¿
èŠããããŸãã ã«ãŒãã« ãã©ã¡ãŒã¿ã®æ§æã¯ããŒã¿ããŒã¹ ãã©ã¡ãŒã¿ã®æ§æã»ã©ç°¡åã§ã¯ãªããæšå¥šäºé
ãäœæããã®ãããå°é£ã§ãã
åºæïŒ habr.com