2013-10-23 17 views
6

Tôi là loại mới để triển khai trong scala và tôi đã định cấu hình plugin sbt-assembly, tất cả đều hoạt động tốt.nhiệm vụ lắp ráp sbt chạy chậm sau khi thêm một số phụ thuộc

Một số ngày trước tôi thêm hadoop, spark và một số phụ thuộc khác, sau đó nhiệm vụ assembly trở nên cực kỳ chậm (8 đến 10 phút) và trước đó, nó là < 30 giây. Hầu hết thời gian được sử dụng để tạo cụm lắp ráp (phải mất vài giây để bình có kích thước 1MB).

Tôi đã quan sát thấy có rất nhiều xung đột hợp nhất, được giải quyết bằng chiến lược first. Điều này có ảnh hưởng đến tốc độ lắp ráp không?

Tôi đã chơi với tùy chọn -Xmx cho sbt (add -Xmx4096m) nhưng không hiệu quả.

Tôi đang sử dụng sbt 12.4 và sbt-assembly. Bất kỳ đề xuất hoặc con trỏ nào để tối ưu hóa tác vụ này?

+2

Bạn đã đọc [Readme] (https://github.com/sbt/sbt-assembly) chưa. Nó đặc biệt gợi ý rằng bạn có thể thay đổi các thiết lập 'cacheUnzip' và' cacheOutput'. Tôi sẽ cho nó thử. –

+0

@ 0__ Tôi đã đọc nó nhưng có vẻ như tất cả các tùy chọn tối ưu hóa được bật theo mặc định – darkjh

+0

Có, nhưng chúng là _options_. Nó có thể là giá trị cố gắng để chuyển đổi mỗi tùy chọn bộ nhớ đệm _off_ để xem nếu nó làm cho một sự khác biệt. –

Trả lời

6

Vì vậy 0__ 's bình luận là đúng vào lúc:

Bạn đã đọc Readme. Nó đặc biệt gợi ý rằng bạn có thể thay đổi các cài đặt cacheUnzipcacheOutput. Tôi sẽ cho nó thử.

cacheUnzip là tính năng tối ưu hóa, nhưng cacheOutput thì không. Mục đích của cacheOutput là để bạn có được bình giống hệt nhau khi nguồn của bạn không thay đổi. Đối với một số người, điều quan trọng là các lọ đầu ra không thay đổi một cách không cần thiết. Thông báo trước là nó kiểm tra hàm băm SHA-1 của tất cả các tệp * .class. Vì vậy, các readme nói:

Nếu có một số lượng lớn các tập tin lớp học, điều này có thể mất một thời gian dài

Từ những gì tôi có thể nói, giải nén và áp dụng các chiến lược hợp nhất lại với nhau mất khoảng một phút hoặc hai, nhưng việc kiểm tra SHA-1 dường như mất mãi mãi. Dưới đây là assembly.sbt rằng tắt output cache:

import AssemblyKeys._ // put this at the top of the file 

assemblySettings 

mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) => { 
    case PathList("javax", "servlet", xs @ _*)   => MergeStrategy.first 
    case PathList("org", "apache", "commons", xs @ _*) => MergeStrategy.first // commons-beanutils-core-1.8.0.jar vs commons-beanutils-1.7.0.jar 
    case PathList("com", "esotericsoftware", "minlog", xs @ _*) => MergeStrategy.first // kryo-2.21.jar vs minlog-1.2.jar 
    case "about.html"         => MergeStrategy.rename 
    case x => old(x) 
    } 
} 

assemblyCacheOutput in assembly := false 

Việc lắp ráp hoàn thành trong 58 giây sau khi làm sạch, và chạy thứ hai mà không làm sạch mất 15 giây. Mặc dù một số lần chạy mất hơn 200 giây.

Nhìn vào nguồn, tôi có thể tối ưu hóa cacheOutput, nhưng hiện tại, tắt tính năng này sẽ giúp lắp ráp nhanh hơn nhiều.

Sửa:

Tôi đã thêm #96 Performance degradation when adding library dependencies dựa trên câu hỏi này, và thêm một số bản sửa lỗi trong sbt-assembly 0.10.1 cho SBT 0,13.

lắp ráp sbt 0.10.1 tránh băm nội dung của các mục đã giải nén của các thư viện phụ thuộc. Nó cũng bỏ qua bộ nhớ đệm jar được thực hiện bởi sbt, vì sbt-assembly đã được lưu vào bộ nhớ đệm đầu ra.

Các thay đổi khiến nhiệm vụ lắp ráp chạy ổn định hơn. Sử dụng tia lửa nặng như dự án mẫu, nhiệm vụ lắp ráp được chạy 15 lần sau một sự thay đổi nguồn nhỏ. sbt-assembly 0.10,0 mất 19 +/- 157 giây (chủ yếu là trong vòng 20 giây, nhưng đi 150 + giây 26% số lần chạy). Mặt khác, sbt-assembly 0.10.1 mất 16 +/- 1 giây.

Các vấn đề liên quan