Greenplum優化方案

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 where t.relname like 'ods%';

select relname from pg_class 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

相關文章
相關標籤/搜索