Mesos 가 예제가 많길래 가장 영향력이 있는 줄 알았는데.



2016.9월.. docker cluster management할 수 있는 툴을 조사해봤다. 




구글의 Kubernetes, Docker Swarm, Apache Mesos, Hashicorp nomand, Coreos Fleet 정도가 있는 것 같다.



mesos가 많이 알려져 있어서 1등 인줄 알았건만, 현실은 역시 구글의 Kubernetes,


 2 등은 Docker swarm 이다. 





Posted by '김용환'
,



scala에서 main 메소드에서 아규먼트를 처리하고 싶을 때를 위한 예시이다. 


Array[String] 타입이라서 collection api를 사용할 수 있다. 


3개의 변수에 한 번에 할당할 수 있는 expression도 제공한다.

def main(args: Array[String]): Unit = {
args.foreach(arg => println(arg))

println(args(0))
println(args(1))
println(args(2))

val (first, second, third) = (args(0).toInt, args(1).toInt, args(2))
println(first)
println(second)
println(third)
println(third.getClass)

println(args.toList)


}






1

2

test

1

2

test

1

2

test

class java.lang.String
List(1, 2, test)


Posted by '김용환'
,

scala 에서 import 문을 쓸 때, java.lang.* 과 같이 쓸 수 있다. 



import java.lang._



한 번에 필요한 클래스만 import 문으로 쓸 수 있다.


import java.lang.{Float, Double, Integer}




특이한 것은 =>을 이용해서 나름 import rename 기능을 쓸 수 있다.


import java.lang.{Long => JLong}
val scalaLong : Long = 1L
println(scalaLong.getClass.getCanonicalName)

val javaLong : JLong = 1L
println(javaLong.getClass.getCanonicalName)


결과는 다음과 같다. scala long과 java long을 나눠 쉽게 쓸 수 있다.


long

java.lang.Long




또한, 여러 줄에 걸쳐 rename할 필요 없이 한 번에 사용할 수 있다.


import java.util.{Map ⇒ JMap, List ⇒ JList}





자바의 static import 기능은 짧게 static 없이 사용한다.


import java.lang.Math._



rename 기능과 static import을 합쳐서 커스텀 메소드도 만들어 낼 수 있다. 


import java.lang.Class.{ forName => classForName }
classForName("com/google/model/Member")






Posted by '김용환'
,

JVM의 safepoint

java core 2016. 9. 8. 17:33




JVM safepoint는 모든 쓰레드가 실행 상태에서 중지된 때의 시간을 의미한다. 즉, stop-the-world 중지 메커니즘이라 할 수 있다. 


safepoint는 stop-the-world 가비지 콜렉션을 포함해 전체 JVM 활동을 조정하기 위해 필요하다. 


자세한 내용은 아래 블로그를 참조한다. 간단하지만 중요한 내용이 있다. 


http://blog.ragozin.info/2012/10/safepoints-in-hotspot-jvm.html



참고로, JVM 내부에 접근하지 못하는 외부 프로파일러와 대조적으로, Flight Recorder는 JVM safepoint 바깥에서 데이터를 접근할 수 있다.



Posted by '김용환'
,



JDK에는 Flight Recorder라는 훌륭한 프로파일러가 포함되어 있다. 진짜 괜찮은 프로파일러이다. 나는 JDK 8(101)을 쓰고 있다.


테스트를 위해서 CPU를 많으 쓰는  MyApp.java 를 생성한다. 



$ java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr MyApp

Started recording 1. The result will be written to:

..

디렉토리에 myrecoding.jfr 에 생성된다.


이제 설치된 java mission control을 실행한다.

$ jmc &


그리고, File - Open 을 클릭해서 myrecoding.jfr을 연다.



프로파일링 관련 다양한 정보를 보여준다.


Flight Recorder는 런타임에 JVM이 나타나는 이벤트를 기록할 수 있는 내부 JVM 후크(hook)를 사용하여 동작할 수 있도록 설계되었다. Flight Recorder가 캡처한 이벤트는 메모리 할당, 쓰레드 상태 변경, IO 동작, CPU 동작을 포함한다.



Flight Recorder는 비-상용 환경에서 무료로 사용할 수 있다. 상용 환경의 사용에 대해서 알려면, 오라클 라이선스-http://docs.oracle.com/javacomponents/jmc-5-5/jfr-runtime-guide/about.htm를 살펴본다.


문서를 보면, 다음과 같이 적혀 있다. 상용 환경에서 사용하려면 commercial license를 획득해야 한다.
Java Flight Recorder requires a commercial license for use in production. To learn more about commercial features and how to enable them please visit http://www.oracle.com/technetwork/java/javaseproducts/.


Flight Recorder는 JMC와 같은 Oracle Java SE Advanced & Suite Products 군에 속한다. 



자세한 내용은 아래를 참고한다. 


http://docs.oracle.com/javacomponents/jmc-5-5/jfr-runtime-guide/about.htm

Posted by '김용환'
,



educated guess의 뜻을 잘 설명한 싸이트



http://m.blog.naver.com/hankahn2008/130170627826




an educated guess - (학식과 경험을 기반으로 하는) 합리적은 추측 (= an informed guess)

a wild guess 막연한 추측

Posted by '김용환'
,

trait는 자바의 interface와 비슷하지만, 내부 구현상 상속을 받으면서 abstract class 역할도 담당한다. 

sealed trait라는 것이 있어서 trait와 비교했다.



model.scala 라는 파일을 다음처럼 생성했다. 



model.scala

sealed trait Order {
def id: Int
def price: Double
}

trait Member {
def id: Int
def name: String
}

case class MemberOrder(id: Int, price: Double) extends Order

case class MemberObject(id: Int, name: String) extends Member


trait는 해당 파일 또는 다른 파일에서 사용할 수 있지만, sealed trait는 c의 static 처럼 해당 파일에서만 사용할 수 있다. 에러가 발생하지 않는다. 





test.scala 파일

case class AnotherMemberObject(id: Int, name: String) extends Member
// case class AnotherMemberOrder(id: Int, name: Double) extends Order // 에러 발생


Order는 sealed trait이기 때문에 외부 파일에서는 상속받을 수 없다. 


Error:(12, 62) illegal inheritance from sealed trait Order

case class AnotherMemberOrder(id: Int, name: Double) extends Order







 scala 내부에서 사용할 trait 또는 class를 sealed modifier를 사용하고, 외부로 오픈할 클래스를 final case class로 연동하기도 한다.




<List>

sealed trait List[+A] {

}

final case class ::[A](head: A, tl: List[A]) extends List[A]

final case class Nil extends List[Nothing]




<Option>

sealed abstract class Option[+A] extends Product with Serializable {

}


final case class Some[+A](x: A) extends Option[A]



<Try>


sealed abstract class Try[+T] {

}

final case class Success[+T](value: T) extends Try[T] 

final case class Failure[+T](exception: Throwable) extends Try[T]




Posted by '김용환'
,




scala 콜렉션의 map은 변형의 의미를 가진다. collection map을 의미하지 않는다. ;;;


1. map 예시이다. 


예시 1- range의 모든 값에 10을 곱하기

예시 2-List[Int]를 List[String]으로 변환하기

예시 3-List[Int]에 내용 변경하기

예시 4-List[String]에 내용 변경하기

println((1 to 10).map(_*10))

val ints = List(3, 10, 15)
println(ints.getClass)
println(ints)

val strings = ints.map(_.toString())
println(strings)

val variants = ints.map {
x => x * 2 + 1
}
println(variants)

val variants2 = strings.map {
x => x * 2
}
println(variants2)



결과


Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)

class scala.collection.immutable.$colon$colon

List(3, 10, 15)

List(3, 10, 15)

List(7, 21, 31)

List(33, 1010, 1515)




2.  flatten 예시이다.



flatten은 콜렉션을 펼쳐놓는 메소드이다.


예시 1 - List의 List를 List로 변환 

예시 2 - Array의 Array를 List로 변환

예시 3 - List의 List를 List로 변환하면서 동일 값은 하나로 모은다. 

val lists = List(List(1), List(2))
println(lists.flatten)

val arrays = Array(Array(3), Array(4))
println(arrays.flatten.toList)

val colleagues = List(List("Kyle", "Jonathan", "Daisy"), List("Kyle", "Ethan"))
println(colleagues.flatten)
println(colleagues.flatten.distinct)


결과는 다음과 같다.


List(1, 2)

List(3, 4)

List(Kyle, Jonathan, Daisy, Kyle, Ethan)

List(Kyle, Jonathan, Daisy, Ethan)




참고로 None을 flatten을 할 때, none은 다 날려준다.

val list = List(Some(1), None, None, Some(2))
println(list.flatten)

결과

List(1, 2)





collection map에도 flatten 메소드를 적용할 수 있다.


val maps = Map("A" -> 1, "B" -> 2)
println(maps.keys.flatten)


결과는 다음과 같다.


Set(A, B)




참고로, values에 대해서 flatten 메소드를 호출하면 어떻게 될까?


val maps = Map("A" -> 1, "B" -> 2)
println(maps.values) println(maps.values.flatten) // 에러 발생


결과이다. 

MapLike(1, 2)


Error:(20, 25) No implicit view available from Int => scala.collection.GenTraversableOnce[B].

    println(maps.values.flatten)



에러가 발생한다. 이유는 MapLike 클래스라서 flatten을 사용할 수 없다. List로 바꿔서 가든지. 그냥 가든지 해야 한다.



아래 코드는 잘 동작한다. 

val maps = Map("A" -> 1, "B" -> 2)
println(maps.values.toList)





collection map의 values에도 사용할 수 있다.

val maps = Map("A" -> List(1), "B" -> List(2))
println(maps.values.flatten)

결과는 다음과 같다. 


List(1, 2)






3. flatmap 예시이다.


flatmap은 map에 flatten을 합성한 메소드이다.


val lists = List(List(1), List(2))
println(lists.flatMap(x => x.map(_*2)))


결과는 다음과 같다. 


List(2, 4)



flatmap은 map와 flatten을 합친 모양인데, 아래와 같이 테스트해서 동작여부를 볼 수 있다. 먼저 map으로 데이터를 변형한 후, flatten을 사용한다.

println(lists.map(x => x.map(_*2)))
println(lists.map(x => x.map(_*2)).flatten)

결과는 동일하다.


List(2, 4)



Posted by '김용환'
,

elasticsearch 벤치마크 툴인 Rally가 4월에 출시되었다.


https://www.elastic.co/kr/blog/announcing-rally-benchmarking-for-elasticsearch


https://github.com/elastic/rally



으와.. 프로파일링과 JIT 컴파일 수까지 표현해준다.


ES 성능 테스트할 때 좋을 것 같다. 




차트와 더 자세한 내용을 보려면 여기를 클릭한다.


https://benchmarks.elastic.co/index.html



https://benchmarks-old.elastic.co/index.html

Posted by '김용환'
,



일반적인 HTTP 성능 테스트를 진행할 때,

일반적인 벤치마크는 웹 서버에서 요청을 처리한 시간을 먼저 저장하고, 클라이언트로 전달되기 직전 시간(응답 시간) 사이의 경과된 시간을 측정한다. 하지만, 웹 서버는 서버에서의 지연 시간(전문용어 latency)만을 측정하지 그 이후는 측정되지 않는다. 


바로 이 문제를 조율된 누락 문제(coordinated omission)라 한다. 성능 벤치마크시 많이 간과하기도 한다. 백분위수가 높거나 TPS가 어이 없이 높다면 의심할 필요가 있다. 


괜찮은 벤치마크일수록 요청을 보낸 순간과 클라이언트에서 응답을 실제로 받는 순간 사이의 시간을 명확히 측정한다. 즉 좋은 HTTP 성능 벤치마크라면, 클라이언트에서 HTTP 요청의 응답을 제대로 받은 순간까지의 시간을 측정할 수 있을 것이다. 


(그래서 Load Runner가 대단한 툴이라 생각하고 있다..)



참고로 더 자세한 내용을 보기 원하면, 두 개의 링크를 참조한다.


https://www.quora.com/In-Java-what-is-Coordinated-Omission



특히 아래 링크는 공부하기 좋은 자료가 있다.


https://groups.google.com/forum/#!msg/mechanical-sympathy/icNZJejUHfE/BfDekfBEs_sJ





참고로,  조율된 누락 문제를 언급한 툴로 elasticsearch rally에 있었다. rally의 현재 이슈에 대해서 elasticsearch 블로그에서 잘 설명되어 있어서, 관련 내용을 살펴보는 것도 좋을 것 같다.


https://www.elastic.co/kr/blog/announcing-rally-benchmarking-for-elasticsearch




아래 이슈에서 열심히 토론 중이다.


https://github.com/elastic/rally/issues/64







Posted by '김용환'
,