ablog

不器用で落着きのない技術者のメモ

psql on EC2 で Redshift のクエリの結果セットが大きい場合のボトルネックを調べる

サマリー

EC2インスタンス(t2.micro)から psql で Redshift に結果セットが100GB以上と大きい select 文を発行すると、CloudWatch メトリクスでネットワーク受信量 (バイト数)が約500MB/分になる。 m5.large では約3.2GB/分のスループットが出た。

  • t2.micro(帯域:最大 5 Gbps=625MB/s)
    • 約500MB/分

  • m5.large(帯域:最大 10 Gbps=1.25GB/s)
    • 約3.2GB/分

検証手順

$ export LC_ALL=C
$ psql "host=redshift-cluster-poc.********.ap-northeast-1.redshift.amazonaws.com user=awsuser dbname=dev port=5439"
CREATE SCHEMA IF NOT EXISTS poc_sample;
  • 検証用にテーブルを作成する
CREATE TABLE poc_sample.lineorder 
(
  lo_orderkey          INTEGER NOT NULL,
  lo_linenumber        INTEGER NOT NULL,
  lo_custkey           INTEGER NOT NULL,
  lo_partkey           INTEGER NOT NULL,
  lo_suppkey           INTEGER NOT NULL,
  lo_orderdate         INTEGER NOT NULL,
  lo_orderpriority     VARCHAR(15) NOT NULL,
  lo_shippriority      VARCHAR(1) NOT NULL,
  lo_quantity          INTEGER NOT NULL,
  lo_extendedprice     INTEGER NOT NULL,
  lo_ordertotalprice   INTEGER NOT NULL,
  lo_discount          INTEGER NOT NULL,
  lo_revenue           INTEGER NOT NULL,
  lo_supplycost        INTEGER NOT NULL,
  lo_tax               INTEGER NOT NULL,
  lo_commitdate        INTEGER NOT NULL,
  lo_shipmode          VARCHAR(10) NOT NULL
);
CREATE TABLE poc_sample.lineorder_10x
(
  lo_orderkey          INTEGER NOT NULL,
  lo_linenumber        INTEGER NOT NULL,
  lo_custkey           INTEGER NOT NULL,
  lo_partkey           INTEGER NOT NULL,
  lo_suppkey           INTEGER NOT NULL,
  lo_orderdate         INTEGER NOT NULL,
  lo_orderpriority     VARCHAR(15) NOT NULL,
  lo_shippriority      VARCHAR(1) NOT NULL,
  lo_quantity          INTEGER NOT NULL,
  lo_extendedprice     INTEGER NOT NULL,
  lo_ordertotalprice   INTEGER NOT NULL,
  lo_discount          INTEGER NOT NULL,
  lo_revenue           INTEGER NOT NULL,
  lo_supplycost        INTEGER NOT NULL,
  lo_tax               INTEGER NOT NULL,
  lo_commitdate        INTEGER NOT NULL,
  lo_shipmode          VARCHAR(10) NOT NULL
);
  • データをロードする
    • 事前に s3://awssampledb-yoheia/ssbgz/(ap-northeast-1) に s3://awssampledbuswest2/ssbgz/(us-west-2) のデータをコピーしている。
copy poc_sample.lineorder from 's3://awssampledb-yoheia/ssbgz/lineorder' 
iam_role 'arn:aws:iam::123456789012:role/redshift-spectrum-s3-fullaccess'
gzip compupdate off region 'ap-northeast-1';
  • データを10倍に増幅する。
insert into poc_sample.lineorder_10x (select * from poc_sample.lineorder);
insert into poc_sample.lineorder_10x (select * from poc_sample.lineorder);
insert into poc_sample.lineorder_10x (select * from poc_sample.lineorder);
insert into poc_sample.lineorder_10x (select * from poc_sample.lineorder);
insert into poc_sample.lineorder_10x (select * from poc_sample.lineorder);
insert into poc_sample.lineorder_10x (select * from poc_sample.lineorder);
insert into poc_sample.lineorder_10x (select * from poc_sample.lineorder);
insert into poc_sample.lineorder_10x (select * from poc_sample.lineorder);
insert into poc_sample.lineorder_10x (select * from poc_sample.lineorder);
insert into poc_sample.lineorder_10x (select * from poc_sample.lineorder);
  • S3 から Redshift にデータロードする。
select  database, schema, "table", size, tbl_rows from svv_table_info where schema = 'poc_sample';

 database |   schema   |     table     |  size  |  tbl_rows  
----------+------------+---------------+--------+------------
 dev      | poc_sample | lineorder     |  25112★25GB |  600037902
 dev      | poc_sample | lineorder_10x | 250597★250GB | 6000379020
(2 rows)
$ cat lineorder.sql 
--\set FETCH_COUNT 10000
select * from poc_sample.lineorder_10x;
  • psql on EC2 から大きな結果セットを取得する。
psql "host=redshift-cluster-poc.********.ap-northeast-1.redshift.amazonaws.com user=awsuser dbname=dev port=5439" -f lineorder.sql 
  • 性能系ツールのインストール
sudo yum -y install git gcc-c++ libpcap-devel.x86_64 libpcap.x86_64 ncurses*
sudo yum -y install htop dstat perf
git clone https://github.com/raboof/nethogs
cd nethogs
make
sudo make install

参考

NetworkIn
すべてのネットワークインターフェイスを通じ、このインスタンスによって受信されたバイトの数。このメトリクスは、1 つのインスタンスへの受信ネットワークトラフィックの量を表しています。

報告された数は、期間中に受信されたバイト数です。基本 (5 分) のモニタリングで統計情報に Sum 使用している場合であれば、この数を 300 で除算してバイト/秒の値を求めることができます。詳細 (1 分) のモニタリングで統計情報に Sum 使用している場合合は、この数を 60 で除算します。

単位: バイト

インスタンスの利用可能な CloudWatch メトリクスのリスト表示 - Amazon Elastic Compute Cloud