1、 參數調整web
一、塊I/O參數算法
1)參數描述sql
此參數用來設置塊設備參數。cookie
2)現參數:網絡
現沒有設置塊I/O參數。session
3)加入參數:app
#vi /etc/rc.d/rc.localtcp
blockdev --setra 16384 /dev/sdbpost
注:master、standby節點不需修改。性能
二、I/O調度算法
因爲數據倉庫屬於IO敏感性應用,爲了提升系統效率,生產環境中,咱們應該在LINUX內核上修改IO調度的算法。以root身份編輯/boot/grub/menu.lst,添加一行
elevator=deadline,可是不要修改failsafe的定義,重啓系統(必須),再以root身份執行命令cat /sys/block/*/queue/scheduler,輸出的每行應該含有有[deadline]。
三、網絡參數
rmem_default — 默認的接收窗口大小。
rmem_max — 接收窗口的最大大小。
wmem_default — 默認的發送窗口大小。
wmem_max — 發送窗口的最大大小
使用 /etc/sysctl.conf 在系統啓動時把參數配置成您所設置的值:
net.core.rmem_default = 256960
net.core.rmem_max = 256960
net.core.wmem_default = 256960
net.core.wmem_max = 256960
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_sack = 0
net.ipv4.tcp_window_scaling = 1
而後從新啓動網絡守護程序/etc/rc.d/init.d/network restart。
四、系統參數(已完成)
一、參數描繪
cat /etc/security/limits.conf
二、現參數:
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
五、GP相關參數
#vi /etc/sysctl.conf
kernel.sem = 250 64000 100 512
kernel.shmmax = 500000000
kernel.shmmni = 4096
kernel.shmall = 4000000000
kernel.sem = 250 64000 100 512
kernel.sysrq = 1
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_forward = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_max_syn_backlog=4096
net.ipv4.conf.all.arp_filter = 1
net.core.netdev_max_backlog=10000
net.ipv4.ip_local_port_range = 1025 65535
一、 kernel.shmmax = 7516192768 (8G,取物理內存16G的50%)
二、 kernel.shmall = 4000000000(物理內存16G時相應大小)
三、 kernel.sem = 250 64000 100 1024
六、GP參數
注:segment host上是4個primary instance,4個mirror instance.
cat /gpmaster/gp-1/postgresql.conf
一、 shared_buffers(local, max_connections*16K)
shared_buffers = 1600MB # master、standby
shared_buffers = 200MB # segment
二、 work_mem(,global,物理內存的2%-4%)
work_mem = 640MB # master、standby
三、 effective_cache_size(master節點,設爲物理內存的85%,15032385536)
effective_cache_size = 9600MB
四、 mainteance_work_mem(global,CREATE INDEX, VACUUM等時用到)
maintenance_work_mem = 800MB
五、 max_connections(local,最大鏈接數)
max_connections = 200 #(master、standby)
max_connections = 1200 #(segment)
六、 max_prepared_transactions(local,與master最大鏈接數相同)
max_prepraed_transacrions=300 #(master與segment instance相同)
2、 表整理(以kn_weblog_detail爲例)
一、 表統計
select relname from pg_class t where t.relname like 'ods%';
select relname from pg_class t where t.relname like 'kn%';
二、 VACUUM
VACUUM [ FULL | FREEZE ] [ VERBOSE ] [ table ]
VACUUM [ FULL | FREEZE ] [ VERBOSE ] ANALYZE [ table [ (column [, ...] ) ] ]
三、 Analyze
ANALYZE [ table [ (column [, ...] ) ] ]
3、 按列存儲優化(以kn_weblog_detail爲例)
一、 建表:
create table temp_huagai_weblog_Detail_test
(
id varchar(128) NULL,
session_id varchar(120) NULL,
ticket_id varchar(120) NULL,
global_user_id int8 NULL,
visit_date timestamp NULL,
visit_day int8 NULL,
email varchar(128) NULL,
ord int8 NULL,
hh24 int8 NULL,
ip varchar(17) NULL,
area_prov varchar(32) NULL,
area_city varchar(32) NULL,
if_in_page varchar(2) NULL,
if_out_page varchar(2) NULL,
if_main_act_page varchar(2) NULL,
if_last_main_act_page varchar(2) NULL,
if_above_page varchar(2) NULL,
page_on_time int8 NULL,
goods_id varchar(50) NULL,
utm_source varchar(128) NULL,
utm_source_type int4 NULL,
utm_medium varchar(128) NULL,
utm_campaign varchar(128) NULL,
loc_url varchar(4096) NULL,
ref_url varchar(4096) NULL,
user_agent varchar(4096) NULL,
browser_name varchar(64) NULL,
os varchar(64) NULL,
resolution varchar(64) NULL,
client_type varchar(64) NULL,
ck_cps_uid varchar(12) NULL,
ck_cps_cid varchar(12) NULL,
url_cps_uid varchar(12) NULL,
url_cps_cid varchar(12) NULL,
goods_history varchar(1024) NULL,
order_id int8 NULL,
ref_id varchar(128) NULL,
time_stamp timestamp NULL,
log_ip int8 NULL
)WITH (appendonly=true, orientation=column,compresstype=QuickLZ,compresslevel=1)
DISTRIBUTED BY (id);
二、 建立位圖索引
CREATE INDEX goods_id _bmp_idx ON temp_huagai_weblog_Detail USING bitmap (goods_id);
4、 性能評估
一、 I/O測試sql
select count(1) from kn_webloG_all_detail where visit_date >= '2011-11-01' and visit_date < '2011-11-02';
二、 CPU測試sql
SELECT a.ID
,a.SESSION_ID
,a.ticket_id
,a.global_user_id
, a.email
,a.ORD
,a.VISIT_DATE
,a.visit_day
,a.HH24
,A.IP
,coalesce(B.Province,'-') as area_prov
,coalesce(B.city,'-') as area_city
, if_in_page
FROM temp_huagai_weblog_Detail A
left join
(
select a.id,B.PROVINCE,B.CITY from temp_huagai_weblog_Detail a
INNER JOIN ODS_IP B ON A.LOG_IP >= B.HOST_FROM WHERE A.LOG_IP <= B.HOST_TO
) B on A.ID = B.ID;
三、評估方法
gpcheckperf -f all_file -d /dbfast1 -d dw
採用gpcheckperf,統計性能數據,完成評估報告。
5、 問題
一、 Sql
二、 insert into OL_MONITORING_HOUR_FACT
select t1.visit_day
,t1.hh24
,t1.pv
,t1.visits
,t1.uv
,t1.uip
,t1.bounces
,t1.exit_visit
,coalesce(t2.order_num,0) visit_order
,coalesce(t2.order_amt,0) visit_order_amt
,coalesce(t2.order_num,0)*1.0/t1.visits exchange_rate
,t1.bounces*1.0/t1.visits bounce_rate
,t1.exit_visit*1.0/t1.pv exit_rate
,now()
from
(
select visit_day,hh24
,count(1) pv
,count(distinct session_id) visits
,count(distinct ticket_id)uv
,count(distinct ip) uip
,sum(case when if_out_page= 1 and if_in_page = 1 then 1 else 0 end) bounces
,sum(case when if_out_page = 1 then 1 else 0 end) exit_visit
from kn_weblog_Detail_hour
where visit_date >= '2011-11-11' and visit_date < '2011-11-12'
group by visit_day,hh24
order by 1,2
)t1
left join
(
SELECT
TO_CHAR(to_timestamp(add_time),'YYYYMMDD') visit_day
,EXTRACT(HOUR FROM to_timestamp(add_time)) hh24
,count(distinct id) order_num
,sum(ORDER_PRICE) order_amt
FROM ods_shop101_tbl_goods_order
WHERE to_timestamp(add_time) >= '2011-11-11' AND to_timestamp(add_time) < '2011-11-12'
GROUP BY TO_CHAR(to_timestamp(add_time),'YYYYMMDD') ,EXTRACT(HOUR FROM to_timestamp(add_time))
ORDER BY 1,2
)t2 on t1.visit_day = t2.visit_day and t1.hh24 = t2.hh24
order by 1,2
6、 測試結果
序號 |
參數 |
取值 |
調整範圍 |
結論 |
1 |
kernel.shmmax |
物理內存50% |
master |
對GP無明顯影響 |
2 |
|
小於物理內存25% |
segment |
過大,GP沒法啓動 |
3 |
kernel.shmall |
物理內存 |
Master/segment |
對GP無明顯影響 |
4 |
kernel.sem |
1024 |
Master/segment |
對GP無明顯影響 |
5 |
塊參數 |
16384 |
Master/segment |
對GP無明顯影響 |
6 |
IO調度算法 |
|
Master/segment |
對GP無明顯影響 |
7 |
網絡參數 |
|
Master/segment |
對GP無明顯影響 |
8 |
max_connections |
200 |
master |
GP啓動正常 |
9 |
|
1200 |
segment |
GP啓動正常 |
10 |
max_prepared_transactions |
300 |
Master/segment |
GP啓動正常 |
11 |
shared_buffers |
400MB |
master |
GP啓動正常 |
12 |
work_mem |
160MB |
global |
GP啓動正常 |
13 |
effective_cache_size |
500MB |
master |
對GP無明顯影響 |
7、 結論
結合前面生產環境上參數優化分析,總結以下:
一、 在生產環境上max_connections和max_prepared_transactions修改致使GP沒法啓動的現象沒有出現;
二、 測試環境上kernel.shmmax(master物理內存50%,segment物理內存25%),沒有使用交換分區。以前,生產環境上,kernel.shmmax(master和 segment)均取物理內存85%,致使內存交換;
在生產環境上shared_buffers修改致使GP沒法啓動的現象沒有出現。
8、 優化建議
能夠進一步在生產環境上逐項優化。
優化方法及步驟以下:
一、 kernel.shmmax:master/standby取物理內存50%;segment取物理內存25%;
二、 max_connections(master/standby爲200segment1200)
max_prepared_transactions(master/standby/segment均爲300)
三、 shared_buffers:
master/standby取物理內存10%;segment取物理內存10%/實例數;
四、 塊參數:16384;
五、 IO調度算法;
六、 網絡參數;
七、 work_mem