4.최종 보고

                    종합설계 프로젝트 최종보고서 요약

팀명

 CLASS                              

제출일

2014 5 27

프로젝트 제목

 Sendfile(2) :                      

Improvement and Analysis of Energy Efficiency over Linux web server

설계 프로젝트 개요

프로젝트 수행 내용 및 중간 결과

프로젝트 요약문

기존의 Linux 버전 2.2부터 사용되었던 함수 ‘Sendfile()’의 향상된 버전인 ‘Sendfile(2)’라는 별도의 함수를 작성한다. Socket과 disk 간의 데이터 전송 시 효율성을 위해 사용된  sendfile()의 장점을 활용하여, Sendfile(2)에서는 MIME type의 Base64를 기반으로 하는 인코딩 방식을 도입하여 user space를 최소로 거치면서 CPU 성능 효율을 높일 수 있도록 개발을 진행하였다.
리눅스 커널 상에서 작성된 Sendfile(2)는 검증 절차의 하나로서 도입된 웹 메일 시스템인 roundcube 상의 메일 서버에서 접목되어 그 성능의 효율성을 판단하고자 한다. 이때 Sendfile(2)의 Base64 인코딩이 되는 부분은 ‘첨부파일’의 전송만이 해당된다. 이를 통해 kernel space와 user space 간의 이동을 최소화 함으로써 보다 빠르고 효율적으로 첨부파일이 전송되도록 한다.
본 프로젝트에서는 Sendfile(2)로 구현된 웹 메일 시스템 상에서 첨부파일을 전송하고, 이와 비교할 수 있는 표본으로서 기존의 _send 함수에 의한 일반적인 첨부파일의 전송을 통하여 socket에서 응답시간을 측정하여 CPU의 성능 평가를 객관적으로 수치화한다.

마일스톤 수행 내용

향상된 개발 목표 : 웹 메일 시스템을 통한 성능 확인
 Sendfile(2)의 구현이 완료되어가면서, 보다 구체적인 관점에서의 Sendfile(2)의 성능 평가가 요구되었다. 따라서 당초 프로젝트 계획에서 나아가서 보다 실체적으로 프로젝트 결과를 확인할 수 있는 방안의 도입을 구상하였다. 이에 Sendfile(2)의 웹 메일 시스템에의 접목이 최선의 결과로 대두되었다. Sendfile(2)의 Base64 기반은 메일 전체를 전송할 시에는 암호화 및 복호화의 의미를 가지지만, 메일 내의 첨부파일 전송 시에 활용될 경우 전송 경로를 단축시킬 수 있는 변환으로서의 의미로 사용될 수 있다고 판단되었기 때문이다. 이에 따라 본 프로젝트는 웹 메일 시스템에 Sendfile(2)이 구현될 수 있도록 개발하는 방향으로 부가적인 일정을 덧붙였다.
 이 과정에서 무료로 배포되는 오픈 소스 메일 시스템으로서, Roundcube와 SquirrelMail 중 개발 환경을 선택하고자 하였는데, SquirrelMail이 국내에 사용자가 많으나 오래된 인터페이스를 가지고 있다는 단점과, Roundcube의 한글 공식 지원 및 높은 성능과 인터페이스의 장점 때문에 Roundcube를 사용하기로 하였다. Roundcube 상에서는 PHP 언어가 토대가 되므로, Sendfile(2)를 적용한 웹 메일 시스템을 구현하기 위해서는 리눅스 커널 상에서 구현한 C 언어 기반의 Sendfile(2)의 알고리즘을 Roundcube의 PHP 라이브러리에 연동하는 과정이 수반되어야 한다. 따라서, PHP 문법을 이용하여 만들 수 없는 함수나 오브젝트를 C 또는 C++ 언어로 작성할 수 있도록 하는 PHP 확장모듈을 통하여 해당 문제를 해결하고자 한다.
 또한, 메일 전송에서 첨부파일 부분만을 Sendfile(2)를 적용하기 위하여 각 메일의 헤더 부분과 첨부 파일, 본문 내용 등에 대한 이해가 필요하였다. 이렇게 본문 내용과 파일 첨부 유무를 switch문에서 나누어 구분하여 첨부파일이 추가된 경우에 한하여 파일 첨부 부분을 Base64로 인코딩되도록 유도하도록 개발하는 것을 목표로 한다.
 이와 같이 웹 메일 시스템 상에서 Sendfile(2)를 구현하여 Base64 방식의 첨부파일 전송이 가능하도록 하여, 이에 따른 성능의 정도를 보다 가시적으로 분석하는 것이 본 프로젝트의 최종 관문이 된다고 할 수 있다.


최종 보고 요약 (하단 프로젝트 전체 흐름도 참조)
* 하위 캡쳐 이미지는 메일의 전송과정과 수신과정에 대한 이해를 돕기 위한 것이다.
 왼쪽은 메일을 보내는 roundcube 상의 화면, 오른쪽은 메일은 받는 Gmail 화면이다. 아래는 메일을 보내는 roundcube 서버와 메일을 받는 Gmail 서버의 구조도를 표현한다. eml 파일의 구성도 중요하다. 메일의 header부분, 본문,첨부파일,메일의 end 부분으로 이루어진다.
* 메일이 전송되는 과정은 다음과 같다.
 먼저 roundcube 사용자가 보내는 사람, 받는 사람, 본문 내용을 쓰고, attatch a file 버튼을 통해 파일을 첨부하게 된다. 이를 통해 upload 함수가 콜되고, 순차적으로 attatchment 함수가 콜이 된다. 이후 커널단의 file system의 임시파일 내에 첨부파일의 복사본이 생성된다. 다음으로 메일의 전송버튼을 누르면 deliver_message 함수가 실행된다.
 전송 시, 총 다섯 번의 전송 과정이 이루어지는데, 첫번째는 메일의 header 부분에서 본문의 마지막 boundary 부분까지, 두번째는 첨부파일의 header 부분, 세번째는 첨부파일 부분, 네번째는 첨부파일의 boundary 부분, 다섯번째는 end of mail 부분이다. 이때, 첨부파일 부분은 sendfile(2)를 사용해서 보내고, 나머지 부분은 sendfile(2)를 사용하지 않고 보낸다. 하위 그림에서 확인해보면, 초록색 부분은 sendfile(2)를 사용하지 않고 전송하는 부분이고, 빨간색의 부분은 구현한 sendfile(2)를 사용해 첨부파일 부분을 전송할 때의 경로를 나타낸다.
 전송이 시작되면 첫번째 전송부분인 메일 header부분과 본문부분 그리고 두번째 전송인 첨부파일의 header부분이 초록색 경로를 따라 _send라는 함수를 콜하는데, 이것은 php_library안에 있는 fwrite를 콜하고 fwrite는 buffer에 메일의 header부분과 본문부분을 전송한다. 이렇게 전송되는 데이터들은 인터넷을 거쳐 gmail서버에 전송된다. 세번째 전송인 첨부파일을 보내기 위해 구현한 sendfil(2)를 사용한다. 첨부파일을 보내기 위해 confirm_call_sendfile2_compiled 함수를 콜하고 이 함수는 php-library 안에 있는 PHP_FUNCTION(confirm_call_sendfile2_compiled)을, 그리고 이 함수는 커널단에 있는 sendfile2를 호출하여 file system에 저장하엿던 첨부파일을 base64_encode를 한 후 file system에서 pipe를 거쳐 buffer를 거친 후 Gmail 서버로 전송된다. 이후 남은 나머지 부분인 첨부파일의 boundray부분과 다섯번째 부분인 end of mail을 앞에서 설명한 _send함수를 통해 전송하면 메일의 전송이 완료된다.  이렇게 전송이 완료되면 web 브라우저에서 gmail을 실행시켰을 때 메일을 수신한 것을 확인할 수 있다.
* 수신하는 과정은 다음과 같다. 우선 전송된 데이터는 tcp/ip에서 유저공간의 application을 거친 다음 data를 관리하는 gmail db server에 저장된다. 그리고 웹브라우저에서 사용자가 수신한 메일을 볼 때는 eml파일을 참조하게 되는데, 이 eml파일은 db server에 저장된 data를 가지고 와서 만든다. 그래서 웹 브라우저에서 사용자는 roundcube에서 메일을 확인할 수 있게 된다.


프로젝트 결과
(1) 메일 전송 시 첨부파일의 base64 인코딩 확인
프로젝트의 결과물로서, roundcube의 web mail system을 통하여 Gmail server로 전송된 mail 상의 첨부파일이 다음의 화면 캡쳐로서 확인할 수 있다. 또한 다음의 전체 흐름도를 통하여 메일 구조 상에서 mail Header와 본문 내용 및 End of mail 부분이 Sendfile(2)를 거치지 않고 _send 함수를 통해 전송되며, 첨부파일의 핵심 부분이 Sendfile(2)를 통하여 Base64 방식으로 인코딩되어 메일로 전송됨을 알 수 있다.

(2) Sendfile(2)를 통해 구현한 시스템의 성능 확인

roundcube 상의 메일 전송 시 첨부파일을 Sendfile(2)를 적용하여 Base64로 인코딩하여 보내는 경우와, 일반 _send 함수를 통하여 전송하는 경우의 response time을 분석하였다. 결과는 다음과 같다.

 

Socket을 막 오픈한 시점에서의 response time은 Sendfile(2)를 사용함으로써 40% 빨라졌으며, Socket을 오픈한 직후의
Response time도 Sendfile(2)를 사용해서 37.5% 빨라졌다. 이를 통해 평균적으로 약 38.75%의 성능 개선이 Sendfile(2)를 통해 이루어졌다고 볼 수 있다. 이는 불필요한 function call을 단축시킴으로써 일어나는 효과라고 할 수 있으며, 혹은 kernel space 내에서 진행될 수 있는 내부적 인코딩 방식을 적극 활용한 결과라고 할 수 있다.
이렇게 발생한 CPU의 성능은 약 38%의 개선 효과를 가지므로, 결국 사용자의 컴퓨터 전체에서의 성능을 좌우할 수 있는 기준으로까지 이어질 수 있다. 따라서 CPU의 성능 향상으로 인한 결과로서, 보다 빠른 속도에서 많은 양의 처리 방식이 가능해질 수 있다. 또는 동일한 업무를 처리한다고 보았을 때, 단축된 시간 내에서 효율적인 진행이 가능하기 때문에 전체 CPU가 소모하는 전력 사용량의 단축에도 도움을 줄 수 있다. 이는 전력 손실을 줄임으로써, 나아가 에너지 절약으로의 차세대 그린 컴퓨터 개발로의 도약까지도 생각해볼 수 있도록 하는 좋은 주제로 활용될 전망이다.


동영상

YouTube 동영상

 

졸업 프로젝트 공개 사이트 주소 (github) :

https://github.com/ssanglee/capstone

첨부화일 (다음 첨부파일 참고)

Ċ
2조 캡스톤,
2014. 5. 27. 오전 7:53
ć
2조 캡스톤,
2014. 5. 27. 오전 7:54
Ċ
2조 캡스톤,
2014. 5. 27. 오전 6:16
Ċ
2조 캡스톤,
2014. 5. 27. 오전 7:53
Comments