Post
KO

성능, 확장성

스레드를 사용하는 가장 큰 목적은 바로 성능을 높이고자 하는 것이다.

스레드를 사용하면 시스템의 자원을 훨씬 효율적으로 활용 할 수 있고, 애플리케이션으로 하여금 시스템이 갖고 있는 능력을 최대한 사용하게 할 수 있다.

성능에 대해

성능을 높인다는 것은 더 적은 자원을 사용하면서 더 많은 일을 하도록 한다는 말이다.

자원이라는 단어는 다음과 같다, 처리해야 할 작업이 있을 때 CPU, 메모리, 네트웍 속도, 데이터베이스 처리 속도, 디스크 용량 등의 자원 가운데 어느 것이 될지 모르지만 항상 모자라는 부분이 발생될 것이다.

더 나은 성능을 목표로 해서 프로그램이 병렬로 동작하도록 만들 때는 두 가지 부분을 우선적으로 생각해야 한다. 먼저 프로그램이 확보할 수 있는 모든 자원을 최대한 활용해야 하고, 남는 자원이 생길 때마다 그 자원 역시 최대한 활용할 수 있도록 해야 한다.

성능 대 확장성

애플리케이션의 성능은 여러 가지 측면에서 자료를 수집해 측정할 수 있는데, 이를테면 서비스 시간, 대기 시간, 처리량, 효율성, 확장성, 용량 등의 수치를 뽑아 낼 수 있다.

이런 지표 가운데 일부는(서비스 시간, 대기 시간) 작업을 처리하는 속도가 얼마나 빠르냐를 말해주고, 다른 수치(용량, 처리량)는 동일한 자원을 가지고 있을 때 얼마나 많은 양의 일을 할 수 있는지 알 수 있다.

확장성(scallability)은 CPU, 메모리, 디스크, I/O 처리 장치 등의 추가적인 장비를 사용해 처리량이나 용량을 얼마나 쉽게 키울 수 있는지를 말한다.

성능을 높이기 위해 튜닝 작업을 하는 경우에 그 목적은 어쨋건 동일한 일을 더 적은 노력으로 하고자 하는 것이다.

예를 들어 O(n^2)의 시간이 걸리는 알고리즘을 O(n log n) 시간에 처리할 수 있는 알고리즘으로 바꾸는 등의 작업이 성능 튜닝을 의미한다.

확장성을 목표로 튜닝을 한다면 처리해야 할 작업을 병렬화해 시스템 가용 자원을 더 많이 끌어다 사용하면 더 많은 일을 처리할 수 있도록 하는 방법을 많이 사용한다.

병렬 처리를 한다는 것은 성능과 확장성을 골고루 생각하여 적용하는 것이다. 어느 한 쪽에 치우쳐서 하는 것이 아니니 둘다 내용을 알고 개발하는 것이 올바른 길이지 않을까 한다.

이와 같이 말하는 것은 확장성을 생각하지 못하고, 하나의 큰 인스턴스를 두고 개발하는 곳이 많이 있다. 단일 구조 애플리케이션이 처리할 수 있는 최대 부하를 넘어서는 작업량을 감당해야 하는 순간이 오면, 문제는 심각해진다. 처리 용량을 단시간에 급격하게 증가시키는 일이 절대적으로 어렵기 때문이다.

성능 트레이드 오프 측정

공학적인 모든 선택의 순간에는 항상 트레이드 오프(trade off)가 존재하기 마련이다.

트레이드 오프에서 어떤 부분을 선택해야 할지를 결정하는 데 필요한 정보가 그다지 충분하지 않은 경우가 많다.

최적화 기법을 너무 이른 시점에 적용하지 말아야 한다. 일단 제대로 동작하게 만들고 난 다음에 빠르게 동작하도록 최적화해야 하며, 예상한 것보다 심각하게 성능이 떨어지는 경우에만 최적화 기법을 적용하는 것으로 충분하다.

비용이라는 것은 시간을 단축시키기 지불하는 비용, 어떤 경우에는 안정성을 확보하기 위해 비용을 지불해야 할 경우도 있다. 또, 성능 최적화하는 다수의 경우에 코드의 가독성과 유지보수의 용이함을 비용으로 지불한다.

빠르다 라고 말하기 전에 생각해볼 질문들은 아래와 같다.

  • 빠르다는 단어가 무엇을 의미하는가?

  • 어떤 조건을 갖춰야 이 방법이 실제로 빠르게 동작하는 것인가? 부하가 적을 때? 아니면 부하가 걸릴 때? 데이터가 많을 때? 아니면 적을 때? 이런 질문에 대한 대답에 명확한 수치를 보여줄 수 있는가?

  • 위 조건에 해당하는 경우가 얼마나 많이 발생하는가? 이 질문에 대한 대답에 명확한 수치를 보여줄 수 있는가?

  • 조건이 달라지는 다른 상황에서도 같은 코드를 사용할 수 있는가?

  • 이 방법으로 성능을 개선하고자 할 때, 숨겨진 비용, 즉 개발 비용이나 유지 보수 비용이 증가하는 부분이 어느 정도인지? 과연 그런 비용을 감수하면서까지 성능 개선 작업을 해야 하는가?

성능을 높이기 위해 안정성을 떨어뜨리는 것은 최악의 상황이며, 결국 한정성과 성능 둘다를 놓치는 결과를 얻을 뿐이다.

성능을 튜닝하는 모든 과정에서 항상 성능 목표에 대한 명확한 요구 사항이 있어야 하며, 그래야 어느 부분을 튜닝하고 어느 시점에서 튜닝을 그만 둬야 하는지 판단할 수 있다.

또한 매우 실제적인 환경에서 실제와 같은 사용자 부하의 특성을 동일하게 나타낼 수 있는 성능 측정 도구가 있어야 한다.

여러가지 최적화 기법을 적용하면 안정성이 떠러지고 유지보수의 어려움이 불가피하게 나타난다. 따라서 성능을 높이기 위해 안정성과 유지 보수 문제에 대한 비용을 일부러 지불해 가면서 성능을 높일 필요가 없다.

추측하지 말고, 실제로 측정해보라.

출처 :

https://book.naver.com/bookdb/book_detail.nhn?bid=4683550

자바 병렬 프로그래밍

자바 병렬 처리 프로그램 작성 안내서!이 책은 자바 병렬 프로그래밍 참고 매뉴얼이다. 병렬 처리 관련 기능에 어떤 것이 있고, 어떻게 사용하는지에 대한 방법뿐 아니라, 그 내부에 숨어 있는 디자인 패턴과 그 패턴을 사용한 원론적인 이유도 살펴본다. 특히 자바 멀티스레드 프로그램에 대한 설계와 구현 노하우를 전수한다. 자바 병렬 프로그래밍 API에 대한 훌륭한 가이드북이자, 스레드 관련 전문 지식을 빼놓지 않고 설명한 점이 돋보인다. 본문은 병렬 처리와 스레드 안전성에 대한 기초, 스레드 안전한 클래스를 작성하는 기법, JAVA.UT

This article is licensed under CC BY 4.0 by the author.