2017-01-01から1年間の記事一覧

HeapAnalyzerを使う

なぜかEclipseのMATが手元のMacでうまく動作しないので同様の機能があるIBMのHeapAnalyzerを使う。 IBM HeapAnalyzer 下段の"Download HeapAnalyzer"からダウンロードできる。 2017年12月時点での最新のバージョンは4.5.6。 実行するには java -Xmx12G -jar …

jvisualvmでKubernetesのScalaアプリケーションのチューニング

JVM

GKEで走るScalaアプリのチューニングをjvisualvmでやったので手法をあとで振り返れるようにメモしておく。 要件としては、所与のマシンスペック・台数の範囲内で、スループットを最大化したいというもの。 さらに、RTBなので、安定した高速なレスポンス速度…

Djangoで実行したSQLログ出力したい(デバッグ用途)

トランザクションまわりの挙動を調べるため。デバッグ用途なので、プロダクションで動かす想定は不要。 Logging | Django documentation | Django https://docs.djangoproject.com/en/1.8/topics/logging/ Django ORM の SQL を出力する方法まとめ - akiyoko…

Macでポートフォワード

今回のケースでいうと、Kubernetes内のPodにローカルからJMXにつないでjvisualvmを使ってチューニングすることが多かったのだが、下記の記事でやったように127.0.0.1のホスト指定が使えないケースが出てきてしまった。 road288.hatenablog.com -Djava.rmi.se…

[Kubernetes][JMX] Kubetenetesで動作するコンテナにjmxで接続する

stackoverflow.com 基本的にはここの通り。 Kubernetesの中で動くPodにJMXでつないで様子をみたいときがある。 そういうときは、まずPod名を調べて、kubectlコマンドでポートフォーワードして、jvisualvmなどのコマンドを使えばOK。 例えばJMXが7000番ポート…

ListのListで、前後の差分のListをつくる

状態遷移の記録をしたいとき、例えばこういうリストがあるときに @ val l = List(List(1, 2, 3, 4, 5), List(3, 4, 5), List(5)) 5個あった要素が、3個になり、1個になった、という遷移を、 2番目の処理で1と2が落ち、 3番目の処理で3と4が落ちた というよう…

nginx-backend間でKeepAliveする

nginxをフロントにおいて、バックエンド(upstream)にリバースプロキシするというのはよくあるけど、nginx - upstreamでkeepaliveさせるには設定がいる。数年前にやっていたのに忘れていたのでメモ。 公式のドキュメントはこちら。 Module ngx_http_upstream…

libmysqlclient-devを入れる

debianを使う。 pythonでmysqlを使うのに必要というので、 $ sudo apt-get install libmysqlclient-dev Reading package lists... Done Building dependency tree Reading state information... Done Package libmysqlclient-dev is not available, but is r…

Stackdriver Traceを使ってみる(準備)

何らかのAPM(Application Performance Management)ツールを入れたい。以前はNew Relicを使っていたことがあるけど、サーバー(というかCPU)の数に応じて費用がどんどん高騰していくし、かといって以前やっていたように複数台のうちの1台に入れる、というの…

Terminatingのまま消えてくれないPodを強制的に削除する

podがいくら待っても消えてくれないとき。 stackoverflow.com --force --grace-period=0をつける。 例: ᐅ kubectl get pods NAME READY STATUS RESTARTS AGE foo-deployment-2799137922-7xc7r 2/2 Running 0 27d bar-deployment-2705092949-mmkf1 3/3 Termi…

http4sをHTTPクライアントとして使う

http4s: HTTP Client にあるとおり。 build.sbt scalaVersion := "2.12.4" val http4sVersion = "0.17.5" libraryDependencies ++= Seq( "org.http4s" %% "http4s-dsl" % http4sVersion, "org.http4s" %% "http4s-blaze-server" % http4sVersion, "org.http4…

java.util.loggingのログをStackdriverに出力する(続き)

前回の続き。 曲がりくねった方法をとってしまったが、java.util.loggingの仕様を順に追って検討すればできた。 java.util.loggingのログの出力の設定は、 java.util.logging.config.class のシステムプロパティの定義があればそれを参照 java.util.logging.…

java.util.loggingの出力の扱いをどうするか

java.util.loggingのログが出力されてStackdriver上でERRORログ扱いになってしまう(結果、ERRORレベルのログの中で重要度の高いログが埋もれてしまう)ことに対処したいと思っている。 今回のケースだと下記のライブラリが該当する。 GitHub - GoogleCloudPla…

ExecutionContextを自分で作る場合

stackoverflow.com とりあえず雑に val es: ExecutorService = Executors.newFixedThreadPool(1000) implicit val executionContext: ExecutionContext = ExecutionContext.fromExecutorService(es) とやってみたが、どれだけスレッド数使うのか計測しないと…

"Class JavaLaunchHelper is implemented in both..."の警告メッセージは1.8.0_152で修正された

MacのIntellijでJavaを実行すると出てきてた警告メッセージ。 objc[8427]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_141.jdk/Contents/Home/bin/java (0x109de34c0) and /Library/Java/JavaVirtualMachin…

「網羅的テストが可能な擬似コード」?

codezine.jp 読んでもよくわからない。ただ、いまの自分の課題感に近い話題だということは分かる。テストコードを書いても、テストできている部分がごく一部である実感だから、テストを書いても安心できない。 後でもう一度読むとともに、関連することを調べ…

Djangoでシンプルなヘルスチェックをつける

ロードバランサの疎通をさせるために、ヘルスチェックのURLパスを作ってそこで200を返す必要があるとき。 www.reddit.com すごくシンプルな方法があった。 urls.py urlpatterns = [ url(r"^", lambda r: HttpResponse()), (略) ] ビューはコールバック関数。…

cloud_sql_proxyのsidecar containerを立てる

GCPのCloud SQLへのつなぎ方にはいくつか方法があるが、Kubernetes内にあるpodから接続するにはアプリのコンテナと同一pod内にcloud_sql_proxyのコンテナを立ててつなぐ方法で設定した。 github.com 基本的にはここにあるテンプレートどおりやっていけば問題…

getClass.getCanonicalNameはNullになることもある

@ trait FooFilter { val filterName: String } defined trait FooFilter @ val a = new FooFilter{ override val filterName = this.getClass.getCanonicalName } a: AnyRef with FooFilter = ammonite.$sess.cmd1$$anon$1@3d904e9c @ a.filterName res2: S…

「Scala High Performance Programming」のメモ

ソースコード github.com HDR Histogram(30P) hdrhistogram.org 一定のデータサイズでヒストグラムを表現できるデータ型?あとで調べる Java Flight Recorderについて(33P) docs.oracle.com 普段はvisualvmを使っているけど、別のことができたっけ・・・ Saf…

logbackに重複してログがでる

基本ぽいな。 Logback – Duplicate log messages java - How to avoid double logging with logback? - Stack Overflow logger要素でadditivityをfalseにする。 <logger name="data-logger" level="info" additivity="false"></logger>

Druidのクイックスタート

クイックスタート。Druidのバージョンは0.10.1。 http://druid.io/docs/0.10.1/tutorials/quickstart.html Quickstartで注意点 Java8を使う メモリは8G以上必要 ホスト名が解決できないといけない(/etc/hostsに追加した) 8090ポート 8081ポート Supersetと…

DruidとSupersetについて調べる

プロジェクトで使いたい!的な機運が高まっているのでセットアップしてみることにする。 ちょっと動かしてみる程度ではなく、プロダクションサービスのデータ分析ツールとして導入に耐えるか、を検証するのがゴール。アーキテクチャを再現可能に構築できて、…

Amazon LinuxでJava8を使う

AWS

yak shavingが止まらない。 github.com Druid使おうと思ったらJava8でないと動かないので入れる。 www.server-world.info インストールはこれだけ。 sudo yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel alternativesコマンドで1.8を適用する…

EitherでLeftとRightそれぞれの場合に関数を適用する

基本ぽいけど考え込んでしまった。 stackoverflow.com Eitherな値でチェーンしているときに、LeftのときにもRightのときにも関数を適用したいという要件があった。 普通に考えれば次のようにすればいい。 scala> val x: Either[Int, Int] = Right(3) x: Eith…

http4sのデフォルトプールの数

いくつだろうと探していたらみつけた。 github.com CPUのコア+1だ。

コンテナの内部からpodやdeploymentの名前にアクセスする

kubernetes.io ここにある通りでできる。 pod名の取得を試してみた。 こんな感じで追加 ᐅ kubectl edit deploy foo-deployment deployment "foo-deployment" edited - name: MY_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name 本来元のyamlを直し…

Kubernetesのcurrent-contextをzshで表示する

複数のGKEクラスタを切り替えて使っていると(特に開発・ステージング・本番など)、いま使っているcontextを混同してしまいがちで、ステージング環境で開発向けのコマンドを打ってしまったりとかしたのでzshのプロンプトに環境をわかりやすく出すようにした…

Kubectlにcontextを追加する

CUIでやろうとしたが方法が見つからず。ウェブコンソールでURLを表示してそれを叩くだけだった。

SpannerがSessionを使い果たしてブロックした

コンテナ内で動くスケジューラが一定時間で動かなくなるバグを追っていた。最初はスケジューラが止まってしまうのかと予想していたが、ブロックしてずっと待っていただけだった。 スレッドダンプをとったらわかった。 "scala-execution-context-global-1802"…