소개

본 장에서는 ProSort의 기본 개념과 특장점, 주요 기능을 기술한다.

1. 개요

ProSort는 대용량 데이터의 정렬(sort), 병합(merge), 변환(transformation), 연산(operation) 작업을 지원하는 툴이며, 작업을 실행할 때 시스템의 리소스와 작업의 부하를 감소시켜 애플리케이션의 성능을 향상시킨다. 다음은 ProSort의 동작 구조를 나타내는 그림이다.

figure prosort structure
ProSort의 동작 구조

ProSort는 Mainframe에서 사용하는 DFSORT Script를 실행할 수 있으며, ProSort가 제공하는 API를 C 프로그램에서 사용할 수 있다. 또한, TmaxSoft의 리호스팅 솔루션인 Tmax OpenFrame®(이하 OpenFrame)과 최적의 상태로 통합 및 연동하여 시스템의 높은 효율과 관리의 편의성을 제공한다. 뿐만 아니라 Asynchronous I/O를 사용하고, CPU 캐시(Cache)를 최대한 활용할 수 있는 정렬 기법을 사용하여 시스템의 높은 성능을 보장한다. 처리 파일의 용량에 따른 리소스의 사용을 최적화하고 자동으로 디스크를 이용하여 Multi-Way, Multi-Pass 정렬을 수행한다. 메모리의 사용이 제한된 상황에서도 안정적으로 정렬 작업을 수행할 수 있다.

Multi-Way는 병렬적으로 Run을 정렬 및 병합하는 방법이다. Multi-Pass는 정렬 및 병합 연산을 수행한 결과를 다시 정렬하고 병합하여 최종 결과를 얻는 방법이다.

2. 특장점

ProSort의 특장점을 간략히 요약하면 다음과 같다.

  • Kernel Thread를 이용한 I/O 성능의 향상

  • 제한된 메모리 상황에서의 안정적인 정렬 처리

  • Mainframe의 정렬 툴과의 호환성 지원

  • 리소스 사용의 최적화

  • 정렬 최적화 기법의 적용

Kernel Thread를 이용한 I/O 성능의 향상

일반적인 Sort 툴은 파일의 입출력 처리를 완료한 후에 정렬을 처리한다. 이러한 방법은 입출력 처리를 할 때 병목현상이 나타나며, 시스템 전체의 성능을 악화시킨다.

다음은 일반적인 Sort 툴의 정렬 처리를 나타내는 그림이다.

figure prosort io others
일반적인 Sort 툴의 정렬 처리

ProSort는 초기 설계부터 파일의 입출력 처리와 정렬을 동시에 처리할 수 있는 멀티 스레드 구조에 Asynchronous I/O를 결합한 파이프라인(Pipeline) 형태로 개발되었다. 즉 Kernel Thread에 Asynchronous I/O를 사용하여 파일의 입출력 처리 속도를 향상시켰다. 또한, 시스템의 환경에 따라 Direct I/O도 지원하고 있다.

다음은 ProSort의 정렬 처리를 나타내는 그림이다.

figure prosort io
ProSort의 정렬 처리
제한된 메모리 상황에서의 안정적인 정렬 처리

ProSort는 메모리의 사용량이 제한된 상황에서도 자동으로 디스크를 이용하여 Multi-Way, Multi-Pass로 수행하여 정렬 작업을 처리할 수 있다. 32MB 이상의 메모리만 확보되면 어떠한 크기의 파일도 정렬할 수 있다.

다음은 최적화된 Multi-Way, Multi-Pass의 정렬 알고리즘을 나타내는 그림이다.

figure prosort disk
Optimal Multi-Way, Multi-Pass Sort Algorithms

위 알고리즘은 메모리 상황에 맞게 디스크의 사용을 최소화하고 시스템의 성능을 극대화하여 적합한 Disk run file merge 방법을 찾는다. 즉 최적화된 정렬 기법을 구현하여 안정적으로 정렬을 처리한다.

Mainframe의 정렬 툴과의 호환성 지원

ProSort는 DFSORT 툴의 문법과 호환되도록 설계하였기 때문에, 기존의 Mainframe사용자도 쉽게 ProSort를 사용할 수 있다.

figure prosort dfsort
DFSORT 툴과의 호환성
리소스 사용의 최적화

일반적인 Sort 툴은 단순한 알고리즘에 의해 80MB의 Disk Run File을 만들어 파일의 I/O 시간을 낭비한다.

다음은 일반적인 Sort 툴이 메모리를 사용하는 방법을 나타내는 그림이다.

figure prosort memory others
일반적인 Sort 툴의 메모리 사용

ProSort는 입력 파일의 크기를 고려하여 메모리에서 처리할 수 있는 크기를 최대화하는 알고리즘을 사용한다. 사용자의 설정 없이 자동으로 최적의 알고리즘을 찾아 사용하기 때문에 시스템의 성능이 높아진다. 알고리즘을 사용하면 크기가 큰 Run을 메모리에 남게 하므로, 파일의 I/O 시간을 줄일 수 있다.

입력 파일의 용량이 큰 경우 시스템의 성능을 향상 시키기 위해 입력 파일을 두 개 이상으로 분할하여 메모리에 보관하거나 별도의 파일로 저장한다. 분할된 각각의 데이터를 Run이라 한다.

다음은 ProSort가 메모리를 사용하는 방법을 나타내는 그림이다.

figure prosort memory
ProSort의 메모리 사용
정렬 최적화 기법의 적용

일반적인 Sort 툴은 정렬 스레드의 개수만을 고려하여 데이터 파티셔닝을 하므로, 최적의 속도로 정렬을 수행하기 어렵다.

다음은 일반적인 Sort 툴의 정렬 방법을 나타내는 그림이다.

figure prosort cache others
일반적인 Sort 툴의 정렬 방법

ProSort는 최근에 연구 및 발표된 정렬의 최적화 기법을 적용하여 설계하였다. 특히, CPU 캐시를 최대한 활용할 수 있는 정렬 알고리즘을 적용하였다. ProSort는 정렬 스레드(Sort Thread)를 고려하여 CPU 캐시를 최대한 활용할 수 있도록 데이터 파티셔닝(Data Partitioning)을 한다.

다음은 ProSort의 정렬 방법을 나타내는 그림이다.

figure prosort cache
ProSort의 정렬 방법

3. 주요 기능

ProSort는 다음과 같은 주요 기능이 있다.

  • SORT, MERGE, COPY

    다음은 SORT, MERGE, COPY 연산에 대한 설명이다.

    연산 설명

    SORT

    입력 파일을 지정된 필드의 기준으로 정렬한다.

    MERGE

    정렬된 여러 개의 파일을 병합한다.

    COPY

    정렬하지 않고, 복사하는 기능을 수행한다.

    입력받은 레코드의 필드 변환 기능과 함께 사용한다.

  • INCLUDE, OMIT

    특정 조건이나 표현식(Expression)을 지정하여 해당 레코드를 출력(output)에 포함시키거나 제거한다.

  • Record Reformatting

    INREC, OUTFIL, OUTREC의 문법을 이용하여 입력된 레코드를 처리 전 필드와 레코드 형식으로 변형을 하거나, 처리 결과인 출력 레코드의 필드와 레코드 형식으로 변형하는 데 사용한다.

  • Record Aggregation

    숫자 타입인 특정 필드의 합계를 구하는 SUM 문법을 제공한다.

  • User Exit Function

    ProSort는 User Exit Function를 이용하여 레코드를 삽입, 변환, 삭제할 수 있도록 지원한다. User Exit Function은 ProSort가 제공하는 INCLUDE, OMIT, INREC, OUTFIL, OUTREC, SUM 문법을 통해 구현할 수 있다. 단, 복잡한 연산이 필요한 경우에만 사용할 것을 권장한다.

    User Exit Function은 ProSort API를 통해서만 사용할 수 있다. ProSort API에 대한 자세한 내용은 ProSort API 함수를 참고한다.

  • MEMORY

    작업할 때 사용할 메모리를 지정한다.

  • WORKSPACE

    작업할 때 사용할 디스크 영역(임시 영역)과 위치를 지정한다.

  • OPTION

    OUTFIL 문법에서는 FNAMES, SAVE, STARTREC, ENDREC 옵션을 지원한다. 또한, 작업할 입력 레코드의 개수를 줄이기 위해 다음의 옵션도 제공한다.

    옵션 설명

    SKIPREC

    SORT나 COPY 연산을 수행하기 전에 스킵(skip)할 레코드의 개수를 지정하는 옵션이다.

    STOPAFT

    SORT나 COPY 연산으로 처리된 레코드의 최대 개수를 지정하는 옵션이다.