/home/by-natures/dev*

ソフトウェア開発者としての技術的なメモと、たまに普通の日記。

2019/04/09 Java でのメモリチューニング

メモリチューニングを久々に。前回は OOM でアプリケーションが落ちる問題に対して調査したのですが、今回はマイナーGCが多発していました。

簡単な処理を大量にさばくアプリケーションなので基本的には Eden からすぐにメモリ解放されるオブジェクトばかりなのですが、処理時間は数十msほど、頻度が数分に一度だったので気になって調整を試みました。当たり前といえば当たり前なのですが、Eden 領域を増やすとマイナーGCにかかる時間が増え、頻度が減ります。Eden 領域を減らすと逆のことが起きました。Eden 領域だけが対象になる GC だとアルゴリズム間で大差ないかもしれません。(環境が Java7 だったので G1GC は試していないです)

余談ですが tomcat は <tomcat>/bin/setenv.sh に Java のオプションを追加していました。Java の起動オプションを変更したくて、起動スクリプトや conf/ のしたばかり探してしまって少し手間取りました。 bin/ の下のファイルを書き換えるのはいつも抵抗あります。

以下のブログではコンカレントGCを利用しない場合の各種パラメータの意味や設定例が紹介されています。コンカレントGCを利用すると、いくつかの値のデフォルト値が大きく変わってしまいますので注意。

d.hatena.ne.jp

GCViewer の紹介。簡単に使えました。

qiita.com

CMS

各種オプションの紹介。コンカレントGC を利用した時の各値の変化も記載されていて分かりやすいです。

fomsan.sakura.ne.jp

G1GC

G1GC を簡単に解説しつつ、他の GC のアルゴリズムとの比較も紹介されています。

qiita.com

2019/04/05 ITP 2.1 対応, ElasticBeanstalk での tomcat 設定値書き換え

4月からオフィスが新しくなって、また一緒に働いていた人が退職したこともあり、労働環境が大きく変わりました。やることは増えましたが、やれることも増えそうなので案外楽しめています。開発リソースが足らず、一緒に働く方を増やしたいので色々と整備しているところです。

ITP 2.1

iOS12.2以降で搭載されるSafari 12.1からITP 2.1が導入される ということで、この対応で手を煩わせている方も多いかもしれません。公式アナウンス:

webkit.org

日本語の解説サイト:

webtan.impress.co.jp

サーバ側の対策としては、secure 属性と HttpOnly 属性をつけましょう、ということです。ただし、HttpOnly をつけてしまうと、JavaScript の document.cookie で呼び出せなくなってしまうので注意です。また、secure 属性をつけると、HTTPS での通信時にしかクライアントからサーバへ該当クッキーは送信されません。

逆に捉えると、HTTP での通信では8日以上保存するクッキーはもう取り扱えない、ということなんですかね。HttpOnly なので document.cookie では読めず、サーバから読もうとすると secure なので送信されず、と。

www.marketechlabo.com

kenzo0107.hatenablog.com

Customize Elastic Beanstalk Using Configuration Files

aws.amazon.com

Beanstalk は便利なのですが、環境の値を変えようと思うと結構面倒です。今回は tomcat の web.xml の値を書き換えたかったのですが、 web.xml ファイルが大きくて ebextensions で扱えず、XML を部分的に置換するような形で対応しました。

扱おうと思っているアプリケーションはアクセスが多いので、ネットワークの値もチューニングしたいのですが、ebextensions がどんどん肥大化します。。

network パフォーマンスチューニング

TIME_WAIT でポート食い尽くしそうだったので少しチューニングしました。

https://www.ginnokagi.com/2012/03/tomcat-3.html

2019/04/01 CORS

他サーバからアクセスしてもらうエンドポイントを追加したのですが、その際に CORS が必要だったので設定した際の記録です。

説明

medium.com

dev.classmethod.jp

Tomcat での対策

Tomcat なら web.xml のフィルタ機能で CORS 対策ができます。7系の途中から追加されているため、7系の場合はバージョンに注意してください。

cors.allowed.origins* が指定できますが、その場合は Access-Control-Allow-Credentials を true にしていてもクッキーのやりとりができません。クッキーのやりとりを行うためには cors.allowed.origins にドメイン、プロトコル、ポートなどのアクセス情報を個別に記述する必要があります。

tomcat.apache.org

CSRF 対策

CSRF 対策に、CORS の preflight の機能を使う説明。preflight なんて何に使うんだろうと思っていましたが、認証のような役割を果たすようです。

numb86-tech.hatenablog.com

2019/03/28 Tomcat リリース備忘録

古いシステムのメンテナンスをする場面があり、Tomcat へ WAR ファイルをデプロイすることになりました。概念はなんとなく理解していたのですが Tomcat への実作業は初めてだったのでメモ。小さいシステムだったのでよかったですが、大きなシステムでドキュメント等が不足していると大変だったかもしれないです。

WAR ファイルのリリース方法

ozuma.hatenablog.jp

pom.xml の packaging が war になっていれば、普通に mvn package などで WAR ファイルが生成されます。これはただの ZIP ファイルなので展開すれば中身のチェックも可能です。

上のブログで詳しく紹介されていますが、Tomcat には unpackWARs と autoDeploy というオプションがあり、リリースする際には注意しなければいけません。特に tomcat を停止して WAR ファイルを差し替えて起動しなおしても、tomcat は WAR ファイルの差し替えが認識できないため、すでに展開されているアプリケーションディレクトリ(WAR ファイルを展開したもの)からスクリプトを読み込んで動作してしまいます。

自動化してしまえば気にしなくても良いことだと思いますが、環境移設の合間にリリースしなければならずに急遽手動でリリースしました。一度経験すると理解が深まります。

2019/03/25 Avro と Protocol Buffers

オフィスが4月から移転するので、今週はバタバタしそうです。移転先では多くの部署が集約されるのですが、そのせいで人が多く、エレベータが長蛇の列・・・という噂もちらほら。駅からも遠いし少し憂鬱ですが、ランチする場所は増えそうなのでお昼は楽しみです。

Apache Avro

システム間でデータをやりとりするためのシリアライズの仕組みです。あまり深く調べてこなかったので、いくつかブログや発表資料などを読みました。

bufferings.hatenablog.com

Avro Sink / Avro Source を利用すると、Avro プロトコルでシステム間のデータ転送が実現できます。

www.slideshare.net

Protocol Buffers との違い

Protocol Buffers も同様の文脈で登場するなと思って調べると、比較資料がありました。とても分かりやすかったです。

www.slideshare.net

パフォーマンスはともかくとして、スキーマ情報の管理の仕方が異なるようです。Protocol Buffers だとモデルクラスを追加しないといけないため、様々なスキーマが現れた場合にどういう運用になるんでしょうか。。Schema Registry でスキーマ管理できる Avro の方が、データの大規模なワークフローを構築する場合は分かりやすい気がします。ただ速度面では Protocol Buffers に軍配が上がります。また、アプリケーション間での通信はスキーマファイルをやりとりしなくてよい Protocol Buffers の方がよさそうです。

データマネジメントについて

「データマネジメント 業務改善の正攻法 戦略から実践」という書籍を同僚に教えてもらったので読み進めています。堅い本のように見えますが序章からかなり面白くて、技術の革新と共にデータは分散され、統一して管理することが難しくなったということです。技術の発展によって利便性が高まると、データの管理面ではネガティブに働くというのは直感に反している気がしますが理解できます。だからこそ「データモデル」を作成して業務をモデリングし、データに基づいた事業戦略などを進めていかなければいけないんですね。

データ総研が2015年に出版しているのですが、値段も良心的で内容もたっぷりです。。輪読向きのような気がしますが、ひとまず一人で読み進めてみます。

https://www.amazon.co.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88-%E6%A5%AD%E5%8B%99%E6%94%B9%E5%96%84%E3%81%AE%E6%AD%A3%E6%94%BB%E6%B3%95-%E6%88%A6%E7%95%A5%E3%81%8B%E3%82%89%E5%AE%9F%E8%B7%B5-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%83%87%E3%83%BC%E3%82%BF%E7%B7%8F%E7%A0%94/dp/4822237001:embed:link

2019/03/20 Glue の SparkSQL が直接 DataCatalog にアクセスできるようになりました

先日のアナウンスで、Glue Job から DataCatalog に直接アクセスできるようになりました。

「AWS Glue によって Apache Spark SQL クエリの実行が可能に」というリリースタイトルがやや誤解を招きそうですが、Spark SQL はもともと利用できたのですが、今までは createOrReplaceTempView をいちいち呼んで Spark SQL で処理するデータを登録しなければいけませんでした。この手間がなくなるというリリースです:

aws.amazon.com

docs.aws.amazon.com

f:id:bynatures:20190320191738p:plain

一番下に、 Use Glue data catalog as the Hive Metastore というオプションが追加されていました。デフォルトではオンになっています。

直感的にはそうあってほしい状態がやっと実現されて嬉しいです。今までは読み込むパーティションを手動で制御していたので手間が減ります。ただ、SparkSQL から直接 DataCatalog を読み込む場合は読み込むデータ範囲はどうなるのか(必要なデータのみ取得してくれるのか)が気になるので動作確認しています。何かわかったら追記します。(追記)Spark の挙動として、WHERE 句の条件で取得するデータを push down するようです。