2020년 3월 9일 월요일

Greenplum에서 리소스 관리


보통 분석 시스템에서 항상 나오는 이야기가 배치는 빠른데, 일반 조회성 쿼리의 성능을 맞출 수 있느냐라는 질문을 많이 받습니다.

전사에서 보는 일별 현황이 있고, 배치도 수행하고, 머신러링 형태로 분석하는 것이 동시에 수행될 때 어느 업무가 중요할까요?

대부분 90% 이상은 전사 일별 현황이 가장 중요하죠. 이는 다수의 사람보는 리포트는 상대적으로 가벼운 쿼리가 대부분이고, 또 빠른 응답을 원합니다. 이에 반면에 배치 처리와 머신러닝 등과 같은 작업은 많은 리소스를 사용하게 되죠. 그리고 오랫동안 수행되는 경향이 있습니다.

이러한 고객의 다양한 요구사항을 맞추기 위해서 Greenplum에서는 Rescoue Group라는 워크로드 매니저를 지원하고 있습니다.

리소스 제한 테스트한 결과는 아래와 같습니다.

1. PL/R 수행시 리소스 관리 기능 예시
   1) SQL
      * 머신러링 PL/R SQL
        [gpadmin@mdw rgtest]$ cat plr.sql
        select  (dw.sp_plr_predict(id,  category, attb01_arr, attb02_arr, attb03_arr) ).*
          from dw.tb_user_data p ;      
       [gpadmin@mdw rgtest]$  
      * 일반 SQL  
        [gpadmin@mdw rgtest]$ cat query.sql
        select count(*) from abalone a, abalone b, abalone c;
        [gpadmin@mdw rgtest]$
     
   2) 수행
      - 쿼리 동시 수행
      * PL/R 쿼리 수행
      [gpadmin@mdw rgtest]$ psql -U udba -ef plr.sql -d gpadmin &
      [gpadmin@mdw rgtest]$ Timing is on.
      select  (dw.sp_plr_predict(id,  category, attb01_arr, attb02_arr, attb03_arr) ).*
          from dw.tb_user_data p ;      
         
      * 일반 SQL 수행
      [gpadmin@mdw rgtest]$ psql -U gpadmin -ef query.sql gpadmin &
      select count(*) from abalone a, abalone b, abalone c;    
      [gpadmin@mdw rgtest]$                            
     
2. 리소스 사용율 비교    
   1) Default 사용시  
      * Top 프로세스 확인(세그먼트 노드의 CPU 확인)
      top - 16:10:27 up 1 day, 11:29,  2 users,  load average: 2.46, 0.67, 0.27
      Tasks: 182 total,   8 running, 174 sleeping,   0 stopped,   0 zombie
      %Cpu(s): 80.7 us, 11.4 sy,  0.0 ni,  7.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
      KiB Mem :  1867024 total,   445608 free,   504276 used,   917140 buff/cache
      KiB Swap:  2097148 total,  2050164 free,    46984 used.   679600 avail Mem 
      
         PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                 
       37956 gpadmin   20   0  637840  14108  10376 R 22.8  0.8   0:08.32 postgres:  6000, gpadmin gpadmin 172.16.25.141(19982) c+    ===> 일반 쿼리
       37957 gpadmin   20   0  637840  14108  10384 R 22.8  0.8   0:08.32 postgres:  6001, gpadmin gpadmin 172.16.25.141(36046) c+    ===> 일반 쿼리
       37981 gpadmin   20   0 1045332 196760  22724 R 22.8 10.5   0:09.32 postgres:  6001, udba gpadmin 172.16.25.141(36080) con8+    ===> PLR  쿼리
       37980 gpadmin   20   0 1045300 195480  22644 R 22.4 10.5   0:09.32 postgres:  6000, udba gpadmin 172.16.25.141(20016) con8+    ===> PLR  쿼리
         737 root      20   0  305148   1988   1500 S  0.3  0.1   1:24.78 /usr/bin/vmtoolsd                                       
       37984 gpadmin   20   0  637620  10872   7160 R  0.3  0.6   0:00.02 postgres:  6000, udba gpadmin 172.16.25.141(20024) con8+
       37985 gpadmin   20   0  637620  10864   7160 R  0.3  0.6   0:00.03 postgres:  6001, udba gpadmin 172.16.25.141(36088) con8+
       38070 root      20   0  145844   5280   4020 S  0.3  0.3   0:00.01 sshd: gpadmin [priv]                                    
           1 root      20   0  125272   2564   1568 S  0.0  0.1   0:59.37 /usr/lib/systemd/systemd --switched-root --system --des+
           2 root      20   0       0      0      0 S  0.0  0.0   0:00.03 [kthreadd]                                              
           3 root      20   0       0      0      0 S  0.0  0.0   0:08.49 [ksoftirqd/0]                                           
           5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 [kworker/0:0H]                                          
           7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 [migration/0]                                           
           8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 [rcu_bh]                                                
           9 root      20   0       0      0      0 S  0.0  0.0   0:35.59 [rcu_sched]                                             
          10 root      rt   0       0      0      0 S  0.0  0.0   0:03.04 [watchdog/0]      
                          
      * Resource Group의 상태 확인 
      [gpadmin@mdw rgtest]$ alias rgs
      alias rgs='psql -c "SELECT * FROM gp_toolkit.gp_resgroup_status_per_segment order by rsgname, hostname;"'    
      [gpadmin@mdw rgtest]$ rgs
          rsgname    | groupid | hostname | segment_id |  cpu  | memory_used
      ---------------+---------+----------+------------+-------+--------------
       admin_group   |    6438 | mdw      |         -1 |  0.52 |           6
       admin_group   |    6438 | sdw1     |          0 | 45.05 |           0
       admin_group   |    6438 | sdw1     |          1 | 44.34 |           0
       admin_group   |    6438 | sdw2     |          2 | 44.62 |           0
       admin_group   |    6438 | sdw2     |          3 | 43.71 |           0
       rgudba             |   32997 | sdw1     |          1 | 46.07 |          40
       rgudba             |   32997 | sdw1     |          0 | 45.44 |          40
       rgudba             |   32997 | sdw2     |          2 | 45.83 |          40
       rgudba             |   32997 | sdw2     |          3 | 46.52 |          40
     
   2) Resource Group 설정 변경
      gpadmin=# alter resource  GROUP admin_group  set CPU_RATE_LIMIT 30;
      ALTER RESOURCE GROUP
      Time: 70.391 ms
      gpadmin=# alter resource  GROUP rgudba  set CPU_RATE_LIMIT 10;
      ALTER RESOURCE GROUP
      Time: 51.999 ms
      gpadmin=#
     
   3) Resource Group 설정 후 리소스 확인        
      * sdw1에서 top으로 확인
       top - 16:12:11 up 1 day, 11:31,  2 users,  load average: 5.22, 2.16, 0.85
       Tasks: 178 total,   5 running, 173 sleeping,   0 stopped,   0 zombie
       %Cpu(s): 88.4 us,  5.3 sy,  0.0 ni,  6.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
       KiB Mem :  1867024 total,   393688 free,   556336 used,   917000 buff/cache
       KiB Swap:  2097148 total,  2050164 free,    46984 used.   627868 avail Mem 
       
          PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                 
        37957 gpadmin   20   0  637840  14108  10384 R 33.9  0.8   0:35.87 postgres:  6001, gpadmin gpadmin 172.16.25.141(36046) c+    ===> 일반 쿼리
        37956 gpadmin   20   0  637840  14108  10376 R 33.6  0.8   0:35.86 postgres:  6000, gpadmin gpadmin 172.16.25.141(19982) c+    ===> 일반 쿼리
        37980 gpadmin   20   0 1073064 222864  22648 R 11.3 11.9   0:27.70 postgres:  6000, udba gpadmin 172.16.25.141(20016) con8+    ===> PLR 쿼리
        37981 gpadmin   20   0 1072940 229340  22728 R 11.3 12.3   0:27.71 postgres:  6001, udba gpadmin 172.16.25.141(36080) con8+    ===> PLR 쿼리
        38004 gpadmin   20   0  157792   2376   1660 R  0.7  0.1   0:00.26 top                                                     
          559 root      20   0   36880   1520   1356 S  0.3  0.1   1:00.36 /usr/lib/systemd/systemd-journald                       
         7887 root      20   0   24252   1708   1396 S  0.3  0.1   0:04.43 /usr/lib/systemd/systemd-logind                         
            1 root      20   0  125272   2564   1568 S  0.0  0.1   0:59.42 /usr/lib/systemd/systemd --switched-root --system --des+
            2 root      20   0       0      0      0 S  0.0  0.0   0:00.03 [kthreadd]                                              
            3 root      20   0       0      0      0 S  0.0  0.0   0:08.51 [ksoftirqd/0]                                           
            5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 [kworker/0:0H]                                          
            7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 [migration/0]                                           
            8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 [rcu_bh]                                                
            9 root      20   0       0      0      0 S  0.0  0.0   0:35.67 [rcu_sched]                                             
           10 root      rt   0       0      0      0 S  0.0  0.0   0:03.04 [watchdog/0]                                            
           12 root      20   0       0      0      0 S  0.0  0.0   0:00.00 [kdevtmpfs]                                             
           13 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 [netns]                                                 
           14 root      20   0       0      0      0 S  0.0  0.0   0:00.05 [khungtaskd]                                            
                                                          
      ==> 머신러닝 쿼리( PL/R )를 호출 할 때에도 일반 유저로 실행할 수 있으며,
          리소스 Group 에 셋팅된 값으로 시스템 리소스를 사용

      * Resource Group의 상태 확인        
      [gpadmin@mdw rgtest]$ alias rgs
      alias rgs='psql -c "SELECT * FROM gp_toolkit.gp_resgroup_status_per_segment order by rsgname, hostname;"'    
      [gpadmin@mdw rgtest]$ rgs
          rsgname    | groupid | hostname | segment_id |  cpu  | memory_used
      ---------------+---------+----------+------------+-------+--------------
       admin_group   |    6438 | mdw      |         -1 |  0.82 |           6
       admin_group   |    6438 | sdw1     |          0 | 66.97 |           0
       admin_group   |    6438 | sdw1     |          1 | 65.07 |           0
       admin_group   |    6438 | sdw2     |          2 | 67.04 |           0
       admin_group   |    6438 | sdw2     |          3 | 67.03 |           0
       rgudba             |   32997 | sdw1     |          1 | 22.14 |          56
       rgudba             |   32997 | sdw1     |          0 | 23.70 |          56
       rgudba             |   32997 | sdw2     |          2 | 22.88 |          64
       rgudba             |   32997 | sdw2     |          3 | 22.88 |          64
      (25 rows)
     
[gpadmin@mdw rgtest]$                    

3. 리스스 그룹 설정을 위한 환경
   1) OS 버전
       - RHEL 7.x 또는 RHEL 6.X  (kernel version 2.6.32-696 or higher)
       - 참고 자료: https://gpdb.docs.pivotal.io/6-4/admin_guide/workload_mgmt_resgroups.html

   2) Resource Group 설정을 위한 OS 설정
    ###  OS 설정 및 cgroup 라이브러리 설치
    # mkdir -p /etc/cgconfig.d
    # vi /etc/cgconfig.d/gpdb.conf
    group gpdb {
         perm {
             task {
                 uid = gpadmin;
                 gid = gpadmin;
             }
             admin {
                 uid = gpadmin;
                 gid = gpadmin;
             }
         }
         cpu {
         }
         cpuacct {
         }
         memory {
         }
         cpuset {
         }
     }
   
    # yum install libcgroup-tools
    # cgconfigparser -l /etc/cgconfig.d/gpdb.conf
   
    ### 설정 확인
    # grep cgroup /proc/mounts
   
    ### 경로 확인
    tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexec,mode=755 0 0
    cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0
   
    ### 각 항목별 경로 확인 및 gpadmin:gpadmin 권한 확인
    # ls -la /sys/fs/cgroup/cpu/gpdb
    # ls -la /sys/fs/cgroup/cpuacct/gpdb
    # ls -la /sys/fs/cgroup/cpuset/gpdb
    # ls -la /sys/fs/cgroup/memory/gpdb
   
    ### 시스템 자동 설정 (서비스 등록)
    # systemctl enable cgconfig.service
    # chkconfig cgconfig on
 
   3) Resource 설정을 위한 DB 설정
   ### Resource Queue 모드에서 Resource Group으로 변경                                                                                                                                                                        
   $ gpconfig -s gp_resource_manager                                                                                                                                                                                                      
   Values on all segments are consistent                                                                                                                                    
   GUC: gp_resource_manager                        
   Master value: queue                              
   Segment value: queue                            
                                                   
   ## group으로 설정 변경                          
   $ gpconfig -c gp_resource_manager -v group      
   $ gpstop -af                                    
   $ gpstart -a                                    
                                                   
   $ gpconfig -s gp_resource_manager                
   Values on all segments are consistent            
   GUC : gp_resource_manager                        
   Master value: group                              
   Segment value: group                            
   $  
       
   ### Resource Group 생성                                      
   - CPU_RATE_LIMIT 및 MEMORY_LIMIT는 세그먼트 호스트의 총 합의 비율을 사용 함.
   - Memory_limit 의 합이 100% 를 넘을 수 없음.    

   ### RG 생성 구문                                                                                                                          
   CREATE RESOURCE GROUP name WITH (group_attribute=value [, ... ])                                            
   where group_attribute is:                                                                                    
      CPU_RATE_LIMIT=integer | CPUSET=tuple                                                                    
      MEMORY_LIMIT=integer                                                                                      
      [ CONCURRENCY=integer ]                                                                                  
      [ MEMORY_SHARED_QUOTA=integer ]                                                                          
      [ MEMORY_SPILL_RATIO=integer ]                                                                            
      [ MEMORY_AUDITOR= {vmtracker | cgroup} ]                                                                  
                                                                                                               
   ### RG 생성                                                                                                  
   CREATE RESOURCE GROUP rgoltp  WITH (CPU_RATE_LIMIT=30,MEMORY_LIMIT=30);                                      
   CREATE RESOURCE GROUP rgadhoc WITH (CPU_RATE_LIMIT=30,MEMORY_LIMIT=30);                                      
   CREATE RESOURCE GROUP rgbatch WITH (CPU_RATE_LIMIT=30,MEMORY_LIMIT=30);                                      
   CREATE RESOURCE GROUP rgroup_extcomp WITH (MEMORY_AUDITOR=cgroup, CONCURRENCY=0, CPUSET='1', MEMORY_LIMIT=10);
                                                                                                               
   ### RG 변경                                                                                                  
   --한번에 여러 개를 바꿀 수 없으며, 각각의 항목에 대해서 변경 가능                                            
   ALTER RESOURCE GROUP name SET group_attribute value                                                          
   where group_attribute is one of:                                                                            
      CONCURRENCY integer                                                                                      
      CPU_RATE_LIMIT integer                                                                                    
      CPUSET tuple                                                                                              
      MEMORY_LIMIT integer                                                                                      
      MEMORY_SHARED_QUOTA integer                                                                              
      MEMORY_SPILL_RATIO integer                                                                                
   ALTER RESOURCE GROUP rgoltp SET CONCURRENCY 7;                                                              
   ALTER RESOURCE GROUP rgadhoc SET MEMORY_LIMIT 25;                                                            
   ALTER RESOURCE GROUP rgbatch SET CPUSET '2,4';                                                              
                                                                                                               
   ### RG 삭제                                                                                                    
   DROP RESOURCE rgoltp exec;                                                                                  
                                                                                                               
   ### RG 할당                                                                                                  
   ALTER ROLE uoltp RESOURCE GROUP  rgoltp;                                                                    
   CREATE ROLE uoltp RESOURCE GROUP rgoltp;                                                                    
                                                                                                               
   ### RG Default 전환                                                                                          
   ALTER ROLE uoltp RESOURCE GROUP NONE;                                                                        
                                                                                                               
   ### RG 리소스 그룹 할당 확인                                                                                  
   SELECT rolname, rsgname FROM pg_roles, pg_resgroup                                                          
        WHERE pg_roles.rolresgroup=pg_resgroup.oid;  

   ### RG 설정 확인                                                                                              
   SELECT * FROM gp_toolkit.gp_resgroup_config;

   ## RQ 리소스 사용량 확인                            
   SELECT * FROM gp_toolkit.gp_resgroup_status;    
                                                 
   ##RG 롤 설정 확인                                
   SELECT rolname, rsgname FROM pg_roles, pg_resgroup
     WHERE pg_roles.rolresgroup=pg_resgroup.oid;



댓글 1개:

  1. Merkur 500c Progress - Deccasino
    Merkur 500c choegocasino Progress. หาเงินออนไลน์ The Merkur 500 was a high-performance safety razor for beginners, a high-performance razor, and an extremely fast- deccasino

    답글삭제

Greenplum Backup & Restore

Greenplum에서는 gpbackup과 gprestore를 이용해서 대량의 데이터를 병렬로 백업/병렬로 복구를 지원하고 있습니다. Full 백업이외에도 incremental 백업을 지원하고 있습니다.  - incremental 백업시에는 반드시 사전...