Linux
將 RAM 翻倍至 32 GB - 現在如何加速“LAPP”伺服器?
我在 CentOS 6.3 四核機器上執行一個小型Facebook 遊戲,帶有 PostgreSQL 8.4.3 + 幾個 PHP 腳本(主要執行
select
查詢)+ 1 個 Perl 守護程序,即使伺服器工作正常,我也建議我的使用者加倍 RAM到 32 GB,他們為此籌集了資金。現在我的問題是我不知道該轉動哪個旋鈕以及如何真正使用額外的記憶體來加速伺服器。
下面是我在高峰時間(晚上)的最高輸出 - 如您所見,未使用 27 GB 的 RAM:
# top - 18:47:55 up 23:12, 2 users, load average: 2.17, 2.31, 2.56 Tasks: 246 total, 2 running, 244 sleeping, 0 stopped, 0 zombie Cpu(s): 12.1%us, 0.2%sy, 0.0%ni, 87.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 32790380k total, 5296664k used, 27493716k free, 197132k buffers Swap: 2096056k total, 0k used, 2096056k free, 3815840k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 12363 postgres 20 0 4376m 717m 710m S 40.6 2.2 2:03.48 postmaster 3842 nobody 20 0 118m 23m 3920 S 12.0 0.1 46:24.68 pref.pl 9178 postgres 20 0 4375m 518m 514m S 11.3 1.6 53:50.63 postmaster 12380 postgres 20 0 4377m 668m 660m S 11.3 2.1 2:33.26 postmaster 12243 postgres 20 0 4377m 668m 662m S 9.3 2.1 2:20.49 postmaster 12438 postgres 20 0 4374m 502m 498m S 6.3 1.6 1:03.34 postmaster 12249 postgres 20 0 4384m 852m 839m S 3.0 2.7 3:59.11 postmaster 12241 postgres 20 0 4378m 632m 625m S 1.7 2.0 2:48.62 postmaster 12156 apache 20 0 366m 27m 17m S 1.0 0.1 0:05.12 httpd 36 root 20 0 0 0 0 S 0.3 0.0 0:01.32 events/1 100 root 39 19 0 0 0 S 0.3 0.0 0:06.04 khugepaged 9217 postgres 20 0 21976 1036 516 S 0.3 0.0 1:01.07 pgbouncer 12010 apache 20 0 376m 37m 17m S 0.3 0.1 0:07.58 httpd 12280 apache 20 0 370m 30m 16m S 0.3 0.1 0:03.17 httpd 12362 apache 20 0 365m 15m 6816 R 0.3 0.0 0:01.90 httpd 12457 apache 20 0 360m 9.8m 3456 S 0.3 0.0 0:00.14 httpd 1 root 20 0 19352 1584 1284 S 0.0 0.0 0:01.03 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd # vmstat 10 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 6 2 0 27323416 196988 3852536 0 0 3 165 15 9 14 0 84 2 0 1 0 0 27422148 197012 3814860 0 0 0 5284 4784 2104 46 1 51 2 0 1 0 0 27454748 197020 3826656 0 0 4 1734 2021 1200 16 0 83 1 0 0 2 0 27514008 197028 3813464 0 0 0 702 1475 1208 8 0 90 2 0 0 0 0 27465612 197040 3813968 0 0 0 1435 1764 1725 10 0 85 5 0 1 0 0 27459260 197060 3814248 0 0 0 2032 2667 1304 22 0 76 1 0 1 0 0 27440076 197064 3827064 0 0 0 1604 3146 2109 27 0 72 1 0 1 0 0 27466796 197068 3814868 0 0 2 1241 2014 1637 13 0 83 3 0 4 0 0 27380104 197072 3848256 0 0 0 1064 2375 894 20 0 79 1 0 1 0 0 27488168 197096 3815296 0 0 0 2075 2697 2220 23 0 75 1 0 1 0 0 27462168 197116 3821380 0 0 0 871 1750 943 13 0 86 1 0 4 0 0 27432100 197128 3822320 0 0 0 3980 4767 2340 46 1 53 1 0 0 0 0 27493716 197132 3815844 0 0 0 1871 3209 2078 27 0 72 1 0 3 0 0 27424284 197132 3827036 0 0 0 1452 2551 1487 18 0 78 3 0 3 0 0 27435428 197160 3824116 0 0 0 2066 3430 2082 29 0 70 1 0 2 0 0 27452004 197172 3817440 0 0 0 1356 2722 1895 23 0 76 1 0 2 0 0 27436668 197176 3826648 0 0 0 1633 3629 2162 30 0 69 1 0 1 0 0 27439924 197204 3823124 0 0 0 1502 1786 1293 14 0 86 0 0 0 0 0 27466696 197212 3816780 0 0 0 1200 1701 1164 13 0 86 0 0 3 0 0 27432204 197212 3818344 0 0 0 2587 2098 2154 16 0 83 1 0 2 0 0 27421088 197224 3827224 0 0 0 1229 2635 1421 21 0 75 3 0 3 0 0 27319136 197232 3832088 0 0 13 2965 4220 1951 40 0 59 1 0 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
我已經做了什麼:
/var/lib/pgsql/data/postgresql.conf(僅限本地連接)
max_connections = 100 shared_buffers = 4096MB work_mem = 16M
/etc/php.ini
memory_limit = 300M [PostgresSQL] pgsql.allow_persistent = Off # because I use pgbouncer
/etc/pgbouncer.ini(也僅限本地連接)
max_client_conn = 600 default_pool_size = 80
/etc/httpd/conf/httpd.conf(尚未修改):
<IfModule prefork.c> StartServers 10 MinSpareServers 8 MaxSpareServers 30 ServerLimit 512 MaxClients 512 MaxRequestsPerChild 4000 </IfModule>
關於如何加快我的 Linux Apache PostgreSQL PHP(又名“LAPP”)伺服器的任何建議?
我實際上希望 Linux 會使用額外的記憶體來記憶體磁碟,但這似乎沒有發生?
更新:
我已經安裝
iotop
,它顯示 PostreSQL 執行 SELECT 和我的 Perl 守護程序(用於 Facebook 遊戲):Total DISK READ: 0.00 B/s | Total DISK WRITE: 101.72 K/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 20555 be/4 postgres 0.00 B/s 78.25 K/s 0.00 % 0.28 % postgres: pref pref [local] SELECT 26397 be/4 postgres 0.00 B/s 1674.51 K/s 0.00 % 0.00 % postgres: pref pref [local] SELECT 26392 be/4 apache 0.00 B/s 3.91 K/s 0.00 % 0.00 % httpd 26402 be/4 postgres 0.00 B/s 3.22 M/s 0.00 % 0.00 % postgres: pref pref [local] SELECT 26448 be/4 apache 0.00 B/s 62.60 K/s 0.00 % 0.00 % httpd 26486 be/4 postgres 0.00 B/s 7.82 K/s 0.00 % 0.00 % postgres: pref pref [local] SELECT 26524 be/4 apache 0.00 B/s 3.91 K/s 0.00 % 0.00 % httpd 15392 be/4 nobody 0.00 B/s 3.91 K/s 0.00 % 0.00 % perl -w /usr/local/pref/pref.pl 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init 2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd] 3 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0] 4 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0] 5 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0] 6 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/0] 7 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/1] 8 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/1] 9 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/1]
似乎磁碟記憶體工作正常,因為
read
總是 0 ?
記憶體更多地是在需求的基礎上完成的。假設每當您對文件執行 read() 操作時,該文件都會被記憶體。因此,如果您的數據庫大小和程序大小都很小,那麼它會盡可能多地記憶體。根據需要,當完成更多查詢時,它會自動記憶體。
您沒有進行任何很棒的交換。有一個參數 vm.vfs_cache_pressure 決定了記憶體記憶體將如何被回收與交換的回收相比。但是,您還沒有達到應該開始調整 VM 的記憶體使用階段。
我的 2 美分 ;)