SlideShare a Scribd company logo
1 of 53
Download to read offline
Big Data Applications and
Tuning in Ceph
Noah Watkins
Red Hat
Who am I?
● Noah Watkins
● Red Hat engineer
○ Big Data applications on Ceph
● PhD candidate at UC Santa Cruz
○ Use Ceph as a research platform
● Contact
○ noahwatkins@gmail.com
2
Today’s Agenda
● Non-technical talk about technical stuff
● Less visible projects that deserve attention
● Ceph is a big ecosystem
○ Running Hadoop on Ceph
○ Tracing and debugging features
○ Custom object interfaces
3
Big Data with
Hadoop and
Ceph
4
Big Data with Ceph and Hadoop
● Do you Hadoop?
5
Big Data with Ceph and Hadoop
● Do you Hadoop?
● Are you running a Ceph cluster?
6
Big Data with Ceph and Hadoop
● Do you Hadoop?
● Are you running a Ceph cluster?
● Combined, they work. End of talk.
National
System
Administrator
Appreciation
Day
7
Why should you care? Consolidation
8
Why should you care? Consolidation
Why should you care? Consolidation
10
FooStore!
FooApp!
Why should you care? Consolidation
11
FooStore!
FooApp!
Why should you care? Consolidation
12
FooStore!
FooApp!
Why should you care? Consolidation
13
FooStore!
FooApp!
$$$
Why should you care? Consolidation
14
FooStore!
FooApp!
Why should you care? Consolidation
15
FooStore!
FooApp! FooApp!
How does it work?
● A shim layer translates file system APIs
○ CephFS <-> Hadoop Common File System
● Opens up the entire Hadoop ecosystem
○ MapReduce
○ Spark
○ Storm
○ Impala
○ HBase
○ The list goes on and on
16
HDFS vs CephFS, 1TB Terasort
17
http://www.mellanox.com/related-docs/whitepapers/wp_hadoop_on_cephfs.pdf
1 Year Old
Results!
What Works and What Doesn’t (yet)
● Locality-aware scheduling
○ The rumors aren’t true :)
● Variable replication and erasure coding
○ Select from existing pools
● Snapshots
● How’s the stability
○ Terasort, HBase, DFSIO
○ Bug fixes and performance tuning (HDFS isn’t strict!)
○ Gets better with each new MDS update 18
Test driving Hadoop on Ceph
● Github
○ https://github.com/ceph/cephfs-hadoop
● Tutorial
○ http://ceph.com/docs/master/cephfs/hadoop/
○ Streamlined installation and new docs coming soon!
● Mailing list
○ Best resource right now
○ http://tracker.ceph.com
19
Tracing and
Debugging with
LTTng
20
Things always go according to plan
21
FooApp!
Things always go according to plan
22
FooApp!
Complex Systems Can’t Be Grokked
23
FooApp!
Complex Systems Can’t Be Grokked
24
FooApp!
What is tracing & why should I care?
● Tracing allows us to see exactly what
happens inside the system
[11:41:53.226668003] (+0.000270968) issdm-45 librbd:aio_read_enter:
{ cpu_id = 0 }, { pthread_id = 140267464296512 }, { imagectx = 0x7F929308F600, name = "kubuntu",
snap_name = "", read_only = 0, offset = 2078900224, length = 31232, completion = 0x7F92935AE190
}
[11:41:53.226730019] (+0.000062016) issdm-45 librbd:aio_read_exit:
{ cpu_id = 0 }, { pthread_id = 140267464296512 }, { retval = 31232 }
[11:41:53.228001617] (+0.001271598) issdm-45 librbd:aio_complete_enter:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190, rval = 31232 }
[11:41:53.228007204] (+0.000005587) issdm-45 librbd:aio_get_return_value_enter:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190 }
[11:41:53.228009718] (+0.000002514) issdm-45 librbd:aio_get_return_value_exit:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { retval = 31232 }
[11:41:53.228016702] (+0.000006984) issdm-45 librbd:aio_complete_exit:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { } 25
RBD
What is tracing & why should I care?
● Tracing allows us to see exactly what
happens inside the system
[11:41:53.226668003] (+0.000270968) issdm-45 librbd:aio_read_enter:
{ cpu_id = 0 }, { pthread_id = 140267464296512 }, { imagectx = 0x7F929308F600, name = "kubuntu",
snap_name = "", read_only = 0, offset = 2078900224, length = 31232, completion = 0x7F92935AE190 }
[11:41:53.226730019] (+0.000062016) issdm-45 librbd:aio_read_exit:
{ cpu_id = 0 }, { pthread_id = 140267464296512 }, { retval = 31232 }
[11:41:53.228001617] (+0.001271598) issdm-45 librbd:aio_complete_enter:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190, rval = 31232 }
[11:41:53.228007204] (+0.000005587) issdm-45 librbd:aio_get_return_value_enter:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190 }
[11:41:53.228009718] (+0.000002514) issdm-45 librbd:aio_get_return_value_exit:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { retval = 31232 }
[11:41:53.228016702] (+0.000006984) issdm-45 librbd:aio_complete_exit:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { }
26
RBD
What is tracing & why should I care?
● Tracing allows us to see exactly what
happens inside the system
[11:41:53.226668003] (+0.000270968) issdm-45 librbd:aio_read_enter:
{ cpu_id = 0 }, { pthread_id = 140267464296512 }, { imagectx = 0x7F929308F600, name = "kubuntu",
snap_name = "", read_only = 0, offset = 2078900224, length = 31232, completion = 0x7F92935AE190 }
[11:41:53.226730019] (+0.000062016) issdm-45 librbd:aio_read_exit:
{ cpu_id = 0 }, { pthread_id = 140267464296512 }, { retval = 31232 }
[11:41:53.228001617] (+0.001271598) issdm-45 librbd:aio_complete_enter:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190, rval = 31232 }
[11:41:53.228007204] (+0.000005587) issdm-45 librbd:aio_get_return_value_enter:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190 }
[11:41:53.228009718] (+0.000002514) issdm-45 librbd:aio_get_return_value_exit:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { retval = 31232 }
[11:41:53.228016702] (+0.000006984) issdm-45 librbd:aio_complete_exit:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { }
27
RBD
What is tracing & why should I care?
● Tracing allows us to see exactly what
happens inside the system
[11:41:53.226668003] (+0.000270968) issdm-45 librbd:aio_read_enter:
{ cpu_id = 0 }, { pthread_id = 140267464296512 }, { imagectx = 0x7F929308F600, name = "kubuntu",
snap_name = "", read_only = 0, offset = 2078900224, length = 31232, completion = 0x7F92935AE190 }
[11:41:53.226730019] (+0.000062016) issdm-45 librbd:aio_read_exit:
{ cpu_id = 0 }, { pthread_id = 140267464296512 }, { retval = 31232 }
[11:41:53.228001617] (+0.001271598) issdm-45 librbd:aio_complete_enter:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190, rval = 31232 }
[11:41:53.228007204] (+0.000005587) issdm-45 librbd:aio_get_return_value_enter:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190 }
[11:41:53.228009718] (+0.000002514) issdm-45 librbd:aio_get_return_value_exit:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { retval = 31232 }
[11:41:53.228016702] (+0.000006984) issdm-45 librbd:aio_complete_exit:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { }
28
RBD
What is tracing & why should I care?
● Tracing allows us to see exactly what
happens inside the system
[11:41:53.226668003] (+0.000270968) issdm-45 librbd:aio_read_enter:
{ cpu_id = 0 }, { pthread_id = 140267464296512 }, { imagectx = 0x7F929308F600, name = "kubuntu",
snap_name = "", read_only = 0, offset = 2078900224, length = 31232, completion = 0x7F92935AE190 }
[11:41:53.226730019] (+0.000062016) issdm-45 librbd:aio_read_exit:
{ cpu_id = 0 }, { pthread_id = 140267464296512 }, { retval = 31232 }
[11:41:53.228001617] (+0.001271598) issdm-45 librbd:aio_complete_enter:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190, rval = 31232 }
[11:41:53.228007204] (+0.000005587) issdm-45 librbd:aio_get_return_value_enter:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190 }
[11:41:53.228009718] (+0.000002514) issdm-45 librbd:aio_get_return_value_exit:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { retval = 31232 }
[11:41:53.228016702] (+0.000006984) issdm-45 librbd:aio_complete_exit:
{ cpu_id = 1 }, { pthread_id = 140266098906880 }, { }
29
RBD
With tracing anything is possible
30
Queue Depth over TimeLatency vs Sector Size
Example: Ceph Request Latency
31
Trace processing pipeline
32
● Processing step examines trace events
● Typically written in Python
● Looking for pairs is a common pattern
○ Time spent in queue
○ Time spent in I/O
○ Client processing time
● Requires knowledge of internal workings
Zipkin, Blkin, and LTTng
33
● Dapper is a Google system
○ Traces causal
relationships
● Zipkin implemented by Twitter
○ Look at the pretty GUI
○ Ignores data sources
● Huge number of raw LTTng
tracepoints in Ceph
○ LTTng → Zipkin (Blkin)
■ Marios Kogias
○ Andrew Shewmaker
○ Adam Crume
Getting started with tracing!
● Lots of tracepoints exist!
○ Adding new points is easy :)
● RBD-Replay
○ Collect and replay RBD traces
○ http://ceph.com/docs/master/rbd/rbd-replay/
● Adding points and discussion
http://noahdesu.github.io/2014/06/01/tracing-ceph-with-
lttng-ust.html 34
TRACEPOINT_EVENT(librados, rados_write_enter,
TP_ARGS(
rados_ioctx_t, ioctx, const char*, oid,
const void*, buf, size_t, len, uint64_t, off),
TP_FIELDS(
ctf_integer_hex(rados_ioctx_t, ioctx, ioctx)
ctf_string(oid, oid)
)
)
[Scripting] Storage
and Compute with
RADOS
35
A different version of a better talk
● The objects in RADOS can have arbitrary
code associated with them
○ Think: “remotely compress object “foo”, please.”
● "Distributed Storage and Compute with
Ceph’s librados”
○ Great talk by Sage Weil
○ Check out YouTube
● Scripting compute with librados
36
How does an OSD handle a request?
37
Client OSDlibrados
read-object(foo)
read-object
transaction
● Client reads an object from an OSD
● The OSD executes a “read” operation
○ The read operation knows how to
access data managed by the OSD
● All operations are executed in a
transactional context
● Exact function can be swapped out
What are RADOS object classes?
38
Client OSDlibrados
get-md5(foo)
transaction
● Client writes some C++ code
● Compiles it into an OSD plugin
● After installing this code can be invoked
● Avoids data transfer
○ Can cache results
● Can simplify application design
MD5-Hash
out-of-band install
Example RADOS object class plugin
int compute_md5(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
{
size_t size;
int ret = cls_cxx_stat(hctx, &size, NULL);
if (ret < 0)
return ret;
bufferlist data;
ret = cls_cxx_read(hctx, 0, size, data);
if (ret < 0)
return ret;
byte digest[AES::BLOCKSIZE];
MD5().CalculateDigest(digest, (byte*)data.c_str(), data.length());
out->append(digest, sizeof(digest));
return 0;
}
39
Example RADOS object class plugin
int compute_md5(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
{
size_t size;
int ret = cls_cxx_stat(hctx, &size, NULL);
if (ret < 0)
return ret;
bufferlist data;
ret = cls_cxx_read(hctx, 0, size, data);
if (ret < 0)
return ret;
byte digest[AES::BLOCKSIZE];
MD5().CalculateDigest(digest, (byte*)data.c_str(), data.length());
out->append(digest, sizeof(digest));
return 0;
}
40
Input provided by client, and
output returned to client.
Example RADOS object class plugin
int compute_md5(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
{
size_t size;
int ret = cls_cxx_stat(hctx, &size, NULL);
if (ret < 0)
return ret;
bufferlist data;
ret = cls_cxx_read(hctx, 0, size, data);
if (ret < 0)
return ret;
byte digest[AES::BLOCKSIZE];
MD5().CalculateDigest(digest, (byte*)data.c_str(), data.length());
out->append(digest, sizeof(digest));
return 0;
}
41
Input provided by client, and
output returned to client.
Stat the object to query its size.
Example RADOS object class plugin
int compute_md5(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
{
size_t size;
int ret = cls_cxx_stat(hctx, &size, NULL);
if (ret < 0)
return ret;
bufferlist data;
ret = cls_cxx_read(hctx, 0, size, data);
if (ret < 0)
return ret;
byte digest[AES::BLOCKSIZE];
MD5().CalculateDigest(digest, (byte*)data.c_str(), data.length());
out->append(digest, sizeof(digest));
return 0;
}
42
Input provided by client, and
output returned to client.
Stat the object to query its size.
Read the entire object into a
buffer.
Example RADOS object class plugin
int compute_md5(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
{
size_t size;
int ret = cls_cxx_stat(hctx, &size, NULL);
if (ret < 0)
return ret;
bufferlist data;
ret = cls_cxx_read(hctx, 0, size, data);
if (ret < 0)
return ret;
byte digest[AES::BLOCKSIZE];
MD5().CalculateDigest(digest, (byte*)data.c_str(), data.length());
out->append(digest, sizeof(digest));
return 0;
}
43
Input provided by client, and
output returned to client.
Stat the object to query its size.
Read the entire object into a
buffer.
Pass this data buffer to the MD5
algorithm
Example RADOS object class plugin
int compute_md5(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
{
size_t size;
int ret = cls_cxx_stat(hctx, &size, NULL);
if (ret < 0)
return ret;
bufferlist data;
ret = cls_cxx_read(hctx, 0, size, data);
if (ret < 0)
return ret;
byte digest[AES::BLOCKSIZE];
MD5().CalculateDigest(digest, (byte*)data.c_str(), data.length());
out->append(digest, sizeof(digest));
return 0;
}
44
Input provided by client, and
output returned to client.
Stat the object to query its size.
Read the entire object into a
buffer.
Pass this data buffer to the MD5
algorithm
Return the MD5 digest to the
client.
Example RADOS object class plugin
int compute_md5(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
{
size_t size;
int ret = cls_cxx_stat(hctx, &size, NULL);
if (ret < 0)
return ret;
bufferlist data;
ret = cls_cxx_read(hctx, 0, size, data);
if (ret < 0)
return ret;
byte digest[AES::BLOCKSIZE];
MD5().CalculateDigest(digest, (byte*)data.c_str(), data.length());
out->append(digest, sizeof(digest));
return 0;
}
45
Input provided by client, and
output returned to client.
Stat the object to query its size.
Read the entire object into a
buffer.
Pass this data buffer to the MD5
algorithm
Return the MD5 digest to the
client.
All in a transactional context.
Dynamic object classes with Lua
46
Client OSDlibrados
call-lua(script, foo)
transaction
● Lua is great as an embedded language
● LuaJIT is a high-performance
implementation
● Allow clients to construct and modify
object classes without compiling or
restarting OSDs
LuaJIT VM
dynamically generated interface
Example: Lua Thumbnail Generator
function thumb(input, output)
-- apply thumbnail spec to original image
local spec_string = input:str()
local blob = get_orig_img()
local img = assert(magick.load_image_from_blob(blob:str()))
img = magick.thumb(img, spec_string)
-- append thumbnail to object
local obj_size = cls.stat()
local img_bl = bufferlist.new()
img_bl:append(img)
cls.write(obj_size, #img_bl, img_bl)
-- save location in leveldb
local loc_spec = #img_bl .. "@" .. obj_size
local loc_spec_bl = bufferlist.new()
loc_spec_bl:append(loc_spec)
cls.map_set_val(spec_string, loc_spec_bl)
end
47
Original Ver.1 Ver.2 Ver.3
Thumbnail Index
● Read object and apply
ImageMagick transformation
● Append (cache) the new version of
the image to the object
● Save the location of the version
indexed by its specification
● Write a smart read function to
consult the cache
● Application can dynamically alter
the transformation applied
App-specific Object Interface
Example: Lua Thumbnail Generator
function thumb(input, output)
-- apply thumbnail spec to original image
local spec_string = input:str()
local blob = get_orig_img()
local img = assert(magick.load_image_from_blob(blob:str()))
img = magick.thumb(img, spec_string)
-- append thumbnail to object
local obj_size = cls.stat()
local img_bl = bufferlist.new()
img_bl:append(img)
cls.write(obj_size, #img_bl, img_bl)
-- save location in leveldb
local loc_spec = #img_bl .. "@" .. obj_size
local loc_spec_bl = bufferlist.new()
loc_spec_bl:append(loc_spec)
cls.map_set_val(spec_string, loc_spec_bl)
end
48
Original Ver.1 Ver.2 Ver.3
Thumbnail Index
● Read object and apply
ImageMagick transformation
● Append (cache) the new version of
the image to the object
● Save the location of the version
indexed by its specification
● Write a smart read function to
consult the cache
● Application can dynamically alter
the transformation applied
App-specific Object Interface
Example: Lua Thumbnail Generator
function thumb(input, output)
-- apply thumbnail spec to original image
local spec_string = input:str()
local blob = get_orig_img()
local img = assert(magick.load_image_from_blob(blob:str()))
img = magick.thumb(img, spec_string)
-- append thumbnail to object
local obj_size = cls.stat()
local img_bl = bufferlist.new()
img_bl:append(img)
cls.write(obj_size, #img_bl, img_bl)
-- save location in leveldb
local loc_spec = #img_bl .. "@" .. obj_size
local loc_spec_bl = bufferlist.new()
loc_spec_bl:append(loc_spec)
cls.map_set_val(spec_string, loc_spec_bl)
end
49
Original Ver.1 Ver.2 Ver.3
Thumbnail Index
● Read object and apply
ImageMagick transformation
● Append (cache) the new version of
the image to the object
● Save the location of the version
indexed by its specification
● Write a smart read function to
consult the cache
● Application can dynamically alter
the transformation applied
App-specific Object Interface
Example: Lua Thumbnail Generator
function thumb(input, output)
-- apply thumbnail spec to original image
local spec_string = input:str()
local blob = get_orig_img()
local img = assert(magick.load_image_from_blob(blob:str()))
img = magick.thumb(img, spec_string)
-- append thumbnail to object
local obj_size = cls.stat()
local img_bl = bufferlist.new()
img_bl:append(img)
cls.write(obj_size, #img_bl, img_bl)
-- save location in leveldb
local loc_spec = #img_bl .. "@" .. obj_size
local loc_spec_bl = bufferlist.new()
loc_spec_bl:append(loc_spec)
cls.map_set_val(spec_string, loc_spec_bl)
end
50
Original Ver.1 Ver.2 Ver.3
Thumbnail Index
● Read object and apply
ImageMagick transformation
● Append (cache) the new version of
the image to the object
● Save the location of the version
indexed by its specification
● Write a smart read function to
consult the cache
● Application can dynamically alter
the transformation applied
App-specific Object Interface
Example: Lua Thumbnail Generator
function thumb(input, output)
-- apply thumbnail spec to original image
local spec_string = input:str()
local blob = get_orig_img()
local img = assert(magick.load_image_from_blob(blob:str()))
img = magick.thumb(img, spec_string)
-- append thumbnail to object
local obj_size = cls.stat()
local img_bl = bufferlist.new()
img_bl:append(img)
cls.write(obj_size, #img_bl, img_bl)
-- save location in leveldb
local loc_spec = #img_bl .. "@" .. obj_size
local loc_spec_bl = bufferlist.new()
loc_spec_bl:append(loc_spec)
cls.map_set_val(spec_string, loc_spec_bl)
end
51
Original Ver.1 Ver.2 Ver.3
Thumbnail Index
● Read object and apply
ImageMagick transformation
● Append (cache) the new version of
the image to the object
● Save the location of the version
indexed by its specification
● Write a smart read function to
consult the cache
● Application can dynamically alter
the transformation applied
App-specific Object Interface
Getting started with scripted RADOS
● Buyer beware!
○ Experimental code
○ Works and fairly stable
● Code available on github
○ http://github.com/ceph/ceph
○ branch: cls-lua
● In-depth explanation and examples
○ http://ceph.com/rados/dynamic-object-interfaces-with-lua/
52
That’s it!
● Lot’s of interesting development
● Ceph is a great platform for experimentation
● Q&A
53

More Related Content

What's hot

YOW2020 Linux Systems Performance
YOW2020 Linux Systems PerformanceYOW2020 Linux Systems Performance
YOW2020 Linux Systems PerformanceBrendan Gregg
 
Hw09 Monitoring Best Practices
Hw09   Monitoring Best PracticesHw09   Monitoring Best Practices
Hw09 Monitoring Best PracticesCloudera, Inc.
 
Modern Linux Tracing Landscape
Modern Linux Tracing LandscapeModern Linux Tracing Landscape
Modern Linux Tracing LandscapeSasha Goldshtein
 
20141219 workshop methylation sequencing analysis
20141219 workshop methylation sequencing analysis20141219 workshop methylation sequencing analysis
20141219 workshop methylation sequencing analysisYi-Feng Chang
 
How To Crack RSA Netrek Binary Verification System
How To Crack RSA Netrek Binary Verification SystemHow To Crack RSA Netrek Binary Verification System
How To Crack RSA Netrek Binary Verification SystemJay Corrales
 
Performance Wins with eBPF: Getting Started (2021)
Performance Wins with eBPF: Getting Started (2021)Performance Wins with eBPF: Getting Started (2021)
Performance Wins with eBPF: Getting Started (2021)Brendan Gregg
 
Linux Performance Tools 2014
Linux Performance Tools 2014Linux Performance Tools 2014
Linux Performance Tools 2014Brendan Gregg
 
Bogdan Kecman Advanced Databasing
Bogdan Kecman Advanced DatabasingBogdan Kecman Advanced Databasing
Bogdan Kecman Advanced DatabasingBogdan Kecman
 
Пример отчета по анализу вредоносного кода TeslaCrypt, подготовленного Cisco ...
Пример отчета по анализу вредоносного кода TeslaCrypt, подготовленного Cisco ...Пример отчета по анализу вредоносного кода TeslaCrypt, подготовленного Cisco ...
Пример отчета по анализу вредоносного кода TeslaCrypt, подготовленного Cisco ...Cisco Russia
 
Node Interactive Debugging Node.js In Production
Node Interactive Debugging Node.js In ProductionNode Interactive Debugging Node.js In Production
Node Interactive Debugging Node.js In ProductionYunong Xiao
 
Пример отчета по анализу вредоносного кода Zeus, подготовленного Cisco AMP Th...
Пример отчета по анализу вредоносного кода Zeus, подготовленного Cisco AMP Th...Пример отчета по анализу вредоносного кода Zeus, подготовленного Cisco AMP Th...
Пример отчета по анализу вредоносного кода Zeus, подготовленного Cisco AMP Th...Cisco Russia
 
Around the world with extensions | PostgreSQL Conference Europe 2018 | Craig ...
Around the world with extensions | PostgreSQL Conference Europe 2018 | Craig ...Around the world with extensions | PostgreSQL Conference Europe 2018 | Craig ...
Around the world with extensions | PostgreSQL Conference Europe 2018 | Craig ...Citus Data
 
[DSC 2016] 系列活動:李泳泉 / 星火燎原 - Spark 機器學習初探
[DSC 2016] 系列活動:李泳泉 / 星火燎原 - Spark 機器學習初探[DSC 2016] 系列活動:李泳泉 / 星火燎原 - Spark 機器學習初探
[DSC 2016] 系列活動:李泳泉 / 星火燎原 - Spark 機器學習初探台灣資料科學年會
 
RedisConf17- durable_rules
RedisConf17- durable_rulesRedisConf17- durable_rules
RedisConf17- durable_rulesRedis Labs
 
DUG'20: 12 - DAOS in Lenovo’s HPC Innovation Center
DUG'20: 12 - DAOS in Lenovo’s HPC Innovation CenterDUG'20: 12 - DAOS in Lenovo’s HPC Innovation Center
DUG'20: 12 - DAOS in Lenovo’s HPC Innovation CenterAndrey Kudryavtsev
 
Video Transcoding at Scale for ABC iview (NDC Sydney)
Video Transcoding at Scale for ABC iview (NDC Sydney)Video Transcoding at Scale for ABC iview (NDC Sydney)
Video Transcoding at Scale for ABC iview (NDC Sydney)Daphne Chong
 
Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...
Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...
Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...Anne Nicolas
 

What's hot (20)

YOW2020 Linux Systems Performance
YOW2020 Linux Systems PerformanceYOW2020 Linux Systems Performance
YOW2020 Linux Systems Performance
 
Hw09 Monitoring Best Practices
Hw09   Monitoring Best PracticesHw09   Monitoring Best Practices
Hw09 Monitoring Best Practices
 
Modern Linux Tracing Landscape
Modern Linux Tracing LandscapeModern Linux Tracing Landscape
Modern Linux Tracing Landscape
 
Cram
CramCram
Cram
 
20141219 workshop methylation sequencing analysis
20141219 workshop methylation sequencing analysis20141219 workshop methylation sequencing analysis
20141219 workshop methylation sequencing analysis
 
How To Crack RSA Netrek Binary Verification System
How To Crack RSA Netrek Binary Verification SystemHow To Crack RSA Netrek Binary Verification System
How To Crack RSA Netrek Binary Verification System
 
Prometheus Storage
Prometheus StoragePrometheus Storage
Prometheus Storage
 
Performance Wins with eBPF: Getting Started (2021)
Performance Wins with eBPF: Getting Started (2021)Performance Wins with eBPF: Getting Started (2021)
Performance Wins with eBPF: Getting Started (2021)
 
Linux Performance Tools 2014
Linux Performance Tools 2014Linux Performance Tools 2014
Linux Performance Tools 2014
 
Bogdan Kecman Advanced Databasing
Bogdan Kecman Advanced DatabasingBogdan Kecman Advanced Databasing
Bogdan Kecman Advanced Databasing
 
Пример отчета по анализу вредоносного кода TeslaCrypt, подготовленного Cisco ...
Пример отчета по анализу вредоносного кода TeslaCrypt, подготовленного Cisco ...Пример отчета по анализу вредоносного кода TeslaCrypt, подготовленного Cisco ...
Пример отчета по анализу вредоносного кода TeslaCrypt, подготовленного Cisco ...
 
Node Interactive Debugging Node.js In Production
Node Interactive Debugging Node.js In ProductionNode Interactive Debugging Node.js In Production
Node Interactive Debugging Node.js In Production
 
Пример отчета по анализу вредоносного кода Zeus, подготовленного Cisco AMP Th...
Пример отчета по анализу вредоносного кода Zeus, подготовленного Cisco AMP Th...Пример отчета по анализу вредоносного кода Zeus, подготовленного Cisco AMP Th...
Пример отчета по анализу вредоносного кода Zeus, подготовленного Cisco AMP Th...
 
Around the world with extensions | PostgreSQL Conference Europe 2018 | Craig ...
Around the world with extensions | PostgreSQL Conference Europe 2018 | Craig ...Around the world with extensions | PostgreSQL Conference Europe 2018 | Craig ...
Around the world with extensions | PostgreSQL Conference Europe 2018 | Craig ...
 
[DSC 2016] 系列活動:李泳泉 / 星火燎原 - Spark 機器學習初探
[DSC 2016] 系列活動:李泳泉 / 星火燎原 - Spark 機器學習初探[DSC 2016] 系列活動:李泳泉 / 星火燎原 - Spark 機器學習初探
[DSC 2016] 系列活動:李泳泉 / 星火燎原 - Spark 機器學習初探
 
RedisConf17- durable_rules
RedisConf17- durable_rulesRedisConf17- durable_rules
RedisConf17- durable_rules
 
DUG'20: 12 - DAOS in Lenovo’s HPC Innovation Center
DUG'20: 12 - DAOS in Lenovo’s HPC Innovation CenterDUG'20: 12 - DAOS in Lenovo’s HPC Innovation Center
DUG'20: 12 - DAOS in Lenovo’s HPC Innovation Center
 
Video Transcoding at Scale for ABC iview (NDC Sydney)
Video Transcoding at Scale for ABC iview (NDC Sydney)Video Transcoding at Scale for ABC iview (NDC Sydney)
Video Transcoding at Scale for ABC iview (NDC Sydney)
 
Apache Spark Workshop
Apache Spark WorkshopApache Spark Workshop
Apache Spark Workshop
 
Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...
Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...
Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...
 

Viewers also liked

как подать заявку на участие
как подать заявку на участиекак подать заявку на участие
как подать заявку на участиеnicsnail
 
32 nguyen tac co ban cua cuoc song
 32 nguyen tac co ban cua cuoc song 32 nguyen tac co ban cua cuoc song
32 nguyen tac co ban cua cuoc songTùng Kinh Bắc
 
How to add corvette rpo option codes with gm tech2
How to add corvette rpo option codes with gm tech2How to add corvette rpo option codes with gm tech2
How to add corvette rpo option codes with gm tech2spobd2
 
Winkworth - Strong H1 results and further growth in lettings (1)
Winkworth - Strong H1 results and further growth in lettings (1)Winkworth - Strong H1 results and further growth in lettings (1)
Winkworth - Strong H1 results and further growth in lettings (1)Dominic Agace
 
Millennials Challenges
Millennials ChallengesMillennials Challenges
Millennials ChallengesJodi Okun
 
Maggie jeans FW15 halfsize 150dpi
Maggie jeans FW15 halfsize 150dpiMaggie jeans FW15 halfsize 150dpi
Maggie jeans FW15 halfsize 150dpiAxel Kolonko
 
Scoala Valea Moldovei Diplome obtinute de elevi la olimpiade si concursuri
Scoala Valea Moldovei   Diplome obtinute de elevi la olimpiade si concursuriScoala Valea Moldovei   Diplome obtinute de elevi la olimpiade si concursuri
Scoala Valea Moldovei Diplome obtinute de elevi la olimpiade si concursuriFedorovici Mihai
 
UN LIBRO SUL CROWDFUNDING PER SCOPRIRNE TUTTI I SEGRETI
UN LIBRO SUL CROWDFUNDING PER SCOPRIRNE TUTTI I SEGRETIUN LIBRO SUL CROWDFUNDING PER SCOPRIRNE TUTTI I SEGRETI
UN LIBRO SUL CROWDFUNDING PER SCOPRIRNE TUTTI I SEGRETIWalter Vassallo
 
Panduan pcmananager
Panduan pcmananagerPanduan pcmananager
Panduan pcmananagerRagil Ono
 
κινητά τηλέφωνα
κινητά τηλέφωνακινητά τηλέφωνα
κινητά τηλέφωναDina Prsn
 

Viewers also liked (15)

как подать заявку на участие
как подать заявку на участиекак подать заявку на участие
как подать заявку на участие
 
Od
 Od Od
Od
 
Ipa fisika
Ipa fisikaIpa fisika
Ipa fisika
 
32 nguyen tac co ban cua cuoc song
 32 nguyen tac co ban cua cuoc song 32 nguyen tac co ban cua cuoc song
32 nguyen tac co ban cua cuoc song
 
How to add corvette rpo option codes with gm tech2
How to add corvette rpo option codes with gm tech2How to add corvette rpo option codes with gm tech2
How to add corvette rpo option codes with gm tech2
 
Winkworth - Strong H1 results and further growth in lettings (1)
Winkworth - Strong H1 results and further growth in lettings (1)Winkworth - Strong H1 results and further growth in lettings (1)
Winkworth - Strong H1 results and further growth in lettings (1)
 
Sbardella - una comunicazione sostenibile per il territorio
Sbardella - una comunicazione sostenibile per il territorioSbardella - una comunicazione sostenibile per il territorio
Sbardella - una comunicazione sostenibile per il territorio
 
Edtec 2
Edtec 2Edtec 2
Edtec 2
 
These Are The Data You Are Looking For
These Are The Data You Are Looking ForThese Are The Data You Are Looking For
These Are The Data You Are Looking For
 
Millennials Challenges
Millennials ChallengesMillennials Challenges
Millennials Challenges
 
Maggie jeans FW15 halfsize 150dpi
Maggie jeans FW15 halfsize 150dpiMaggie jeans FW15 halfsize 150dpi
Maggie jeans FW15 halfsize 150dpi
 
Scoala Valea Moldovei Diplome obtinute de elevi la olimpiade si concursuri
Scoala Valea Moldovei   Diplome obtinute de elevi la olimpiade si concursuriScoala Valea Moldovei   Diplome obtinute de elevi la olimpiade si concursuri
Scoala Valea Moldovei Diplome obtinute de elevi la olimpiade si concursuri
 
UN LIBRO SUL CROWDFUNDING PER SCOPRIRNE TUTTI I SEGRETI
UN LIBRO SUL CROWDFUNDING PER SCOPRIRNE TUTTI I SEGRETIUN LIBRO SUL CROWDFUNDING PER SCOPRIRNE TUTTI I SEGRETI
UN LIBRO SUL CROWDFUNDING PER SCOPRIRNE TUTTI I SEGRETI
 
Panduan pcmananager
Panduan pcmananagerPanduan pcmananager
Panduan pcmananager
 
κινητά τηλέφωνα
κινητά τηλέφωνακινητά τηλέφωνα
κινητά τηλέφωνα
 

Similar to Ceph Day SF 2015 - Big Data Applications and Tuning in Ceph

Troubleshooting .net core on linux
Troubleshooting .net core on linuxTroubleshooting .net core on linux
Troubleshooting .net core on linuxPavel Klimiankou
 
BKK16-302: Android Optimizing Compiler: New Member Assimilation Guide
BKK16-302: Android Optimizing Compiler: New Member Assimilation GuideBKK16-302: Android Optimizing Compiler: New Member Assimilation Guide
BKK16-302: Android Optimizing Compiler: New Member Assimilation GuideLinaro
 
Linux kernel tracing superpowers in the cloud
Linux kernel tracing superpowers in the cloudLinux kernel tracing superpowers in the cloud
Linux kernel tracing superpowers in the cloudAndrea Righi
 
Neo4j after 1 year in production
Neo4j after 1 year in productionNeo4j after 1 year in production
Neo4j after 1 year in productionAndrew Nikishaev
 
Multiplatform JIT Code Generator for NetBSD by Alexander Nasonov
Multiplatform JIT Code Generator for NetBSD by Alexander NasonovMultiplatform JIT Code Generator for NetBSD by Alexander Nasonov
Multiplatform JIT Code Generator for NetBSD by Alexander Nasonoveurobsdcon
 
BPF: Tracing and more
BPF: Tracing and moreBPF: Tracing and more
BPF: Tracing and moreBrendan Gregg
 
Hadoop in Data Warehousing
Hadoop in Data WarehousingHadoop in Data Warehousing
Hadoop in Data WarehousingAlexey Grigorev
 
A Brief Introduction of TiDB (Percona Live)
A Brief Introduction of TiDB (Percona Live)A Brief Introduction of TiDB (Percona Live)
A Brief Introduction of TiDB (Percona Live)PingCAP
 
Global Interpreter Lock: Episode I - Break the Seal
Global Interpreter Lock: Episode I - Break the SealGlobal Interpreter Lock: Episode I - Break the Seal
Global Interpreter Lock: Episode I - Break the SealTzung-Bi Shih
 
PGConf.ASIA 2019 Bali - Patroni in 2019 - Alexander Kukushkin
PGConf.ASIA 2019 Bali - Patroni in 2019 - Alexander KukushkinPGConf.ASIA 2019 Bali - Patroni in 2019 - Alexander Kukushkin
PGConf.ASIA 2019 Bali - Patroni in 2019 - Alexander KukushkinEqunix Business Solutions
 
Debugging Hung Python Processes With GDB
Debugging Hung Python Processes With GDBDebugging Hung Python Processes With GDB
Debugging Hung Python Processes With GDBbmbouter
 
Building Network Functions with eBPF & BCC
Building Network Functions with eBPF & BCCBuilding Network Functions with eBPF & BCC
Building Network Functions with eBPF & BCCKernel TLV
 
CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak
CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak   CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak
CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak PROIDEA
 
PyTorch crash course
PyTorch crash coursePyTorch crash course
PyTorch crash courseNader Karimi
 
More on gdb for my sql db as (fosdem 2016)
More on gdb for my sql db as (fosdem 2016)More on gdb for my sql db as (fosdem 2016)
More on gdb for my sql db as (fosdem 2016)Valeriy Kravchuk
 
CUDA-Python and RAPIDS for blazing fast scientific computing
CUDA-Python and RAPIDS for blazing fast scientific computingCUDA-Python and RAPIDS for blazing fast scientific computing
CUDA-Python and RAPIDS for blazing fast scientific computinginside-BigData.com
 
Improving go-git performance
Improving go-git performanceImproving go-git performance
Improving go-git performancesource{d}
 

Similar to Ceph Day SF 2015 - Big Data Applications and Tuning in Ceph (20)

Troubleshooting .net core on linux
Troubleshooting .net core on linuxTroubleshooting .net core on linux
Troubleshooting .net core on linux
 
BKK16-302: Android Optimizing Compiler: New Member Assimilation Guide
BKK16-302: Android Optimizing Compiler: New Member Assimilation GuideBKK16-302: Android Optimizing Compiler: New Member Assimilation Guide
BKK16-302: Android Optimizing Compiler: New Member Assimilation Guide
 
Linux kernel tracing superpowers in the cloud
Linux kernel tracing superpowers in the cloudLinux kernel tracing superpowers in the cloud
Linux kernel tracing superpowers in the cloud
 
Neo4j after 1 year in production
Neo4j after 1 year in productionNeo4j after 1 year in production
Neo4j after 1 year in production
 
Explain this!
Explain this!Explain this!
Explain this!
 
Multiplatform JIT Code Generator for NetBSD by Alexander Nasonov
Multiplatform JIT Code Generator for NetBSD by Alexander NasonovMultiplatform JIT Code Generator for NetBSD by Alexander Nasonov
Multiplatform JIT Code Generator for NetBSD by Alexander Nasonov
 
BPF: Tracing and more
BPF: Tracing and moreBPF: Tracing and more
BPF: Tracing and more
 
Hadoop in Data Warehousing
Hadoop in Data WarehousingHadoop in Data Warehousing
Hadoop in Data Warehousing
 
A Brief Introduction of TiDB (Percona Live)
A Brief Introduction of TiDB (Percona Live)A Brief Introduction of TiDB (Percona Live)
A Brief Introduction of TiDB (Percona Live)
 
Global Interpreter Lock: Episode I - Break the Seal
Global Interpreter Lock: Episode I - Break the SealGlobal Interpreter Lock: Episode I - Break the Seal
Global Interpreter Lock: Episode I - Break the Seal
 
PGConf.ASIA 2019 Bali - Patroni in 2019 - Alexander Kukushkin
PGConf.ASIA 2019 Bali - Patroni in 2019 - Alexander KukushkinPGConf.ASIA 2019 Bali - Patroni in 2019 - Alexander Kukushkin
PGConf.ASIA 2019 Bali - Patroni in 2019 - Alexander Kukushkin
 
Debugging Hung Python Processes With GDB
Debugging Hung Python Processes With GDBDebugging Hung Python Processes With GDB
Debugging Hung Python Processes With GDB
 
Building Network Functions with eBPF & BCC
Building Network Functions with eBPF & BCCBuilding Network Functions with eBPF & BCC
Building Network Functions with eBPF & BCC
 
CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak
CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak   CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak
CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak
 
Multipath
MultipathMultipath
Multipath
 
PyTorch crash course
PyTorch crash coursePyTorch crash course
PyTorch crash course
 
More on gdb for my sql db as (fosdem 2016)
More on gdb for my sql db as (fosdem 2016)More on gdb for my sql db as (fosdem 2016)
More on gdb for my sql db as (fosdem 2016)
 
CUDA-Python and RAPIDS for blazing fast scientific computing
CUDA-Python and RAPIDS for blazing fast scientific computingCUDA-Python and RAPIDS for blazing fast scientific computing
CUDA-Python and RAPIDS for blazing fast scientific computing
 
Improving go-git performance
Improving go-git performanceImproving go-git performance
Improving go-git performance
 
Log
LogLog
Log
 

Recently uploaded

#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024BookNet Canada
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
costume and set research powerpoint presentation
costume and set research powerpoint presentationcostume and set research powerpoint presentation
costume and set research powerpoint presentationphoebematthew05
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 

Recently uploaded (20)

#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
The transition to renewables in India.pdf
The transition to renewables in India.pdfThe transition to renewables in India.pdf
The transition to renewables in India.pdf
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
costume and set research powerpoint presentation
costume and set research powerpoint presentationcostume and set research powerpoint presentation
costume and set research powerpoint presentation
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 

Ceph Day SF 2015 - Big Data Applications and Tuning in Ceph

  • 1. Big Data Applications and Tuning in Ceph Noah Watkins Red Hat
  • 2. Who am I? ● Noah Watkins ● Red Hat engineer ○ Big Data applications on Ceph ● PhD candidate at UC Santa Cruz ○ Use Ceph as a research platform ● Contact ○ noahwatkins@gmail.com 2
  • 3. Today’s Agenda ● Non-technical talk about technical stuff ● Less visible projects that deserve attention ● Ceph is a big ecosystem ○ Running Hadoop on Ceph ○ Tracing and debugging features ○ Custom object interfaces 3
  • 4. Big Data with Hadoop and Ceph 4
  • 5. Big Data with Ceph and Hadoop ● Do you Hadoop? 5
  • 6. Big Data with Ceph and Hadoop ● Do you Hadoop? ● Are you running a Ceph cluster? 6
  • 7. Big Data with Ceph and Hadoop ● Do you Hadoop? ● Are you running a Ceph cluster? ● Combined, they work. End of talk. National System Administrator Appreciation Day 7
  • 8. Why should you care? Consolidation 8
  • 9. Why should you care? Consolidation
  • 10. Why should you care? Consolidation 10 FooStore! FooApp!
  • 11. Why should you care? Consolidation 11 FooStore! FooApp!
  • 12. Why should you care? Consolidation 12 FooStore! FooApp!
  • 13. Why should you care? Consolidation 13 FooStore! FooApp! $$$
  • 14. Why should you care? Consolidation 14 FooStore! FooApp!
  • 15. Why should you care? Consolidation 15 FooStore! FooApp! FooApp!
  • 16. How does it work? ● A shim layer translates file system APIs ○ CephFS <-> Hadoop Common File System ● Opens up the entire Hadoop ecosystem ○ MapReduce ○ Spark ○ Storm ○ Impala ○ HBase ○ The list goes on and on 16
  • 17. HDFS vs CephFS, 1TB Terasort 17 http://www.mellanox.com/related-docs/whitepapers/wp_hadoop_on_cephfs.pdf 1 Year Old Results!
  • 18. What Works and What Doesn’t (yet) ● Locality-aware scheduling ○ The rumors aren’t true :) ● Variable replication and erasure coding ○ Select from existing pools ● Snapshots ● How’s the stability ○ Terasort, HBase, DFSIO ○ Bug fixes and performance tuning (HDFS isn’t strict!) ○ Gets better with each new MDS update 18
  • 19. Test driving Hadoop on Ceph ● Github ○ https://github.com/ceph/cephfs-hadoop ● Tutorial ○ http://ceph.com/docs/master/cephfs/hadoop/ ○ Streamlined installation and new docs coming soon! ● Mailing list ○ Best resource right now ○ http://tracker.ceph.com 19
  • 21. Things always go according to plan 21 FooApp!
  • 22. Things always go according to plan 22 FooApp!
  • 23. Complex Systems Can’t Be Grokked 23 FooApp!
  • 24. Complex Systems Can’t Be Grokked 24 FooApp!
  • 25. What is tracing & why should I care? ● Tracing allows us to see exactly what happens inside the system [11:41:53.226668003] (+0.000270968) issdm-45 librbd:aio_read_enter: { cpu_id = 0 }, { pthread_id = 140267464296512 }, { imagectx = 0x7F929308F600, name = "kubuntu", snap_name = "", read_only = 0, offset = 2078900224, length = 31232, completion = 0x7F92935AE190 } [11:41:53.226730019] (+0.000062016) issdm-45 librbd:aio_read_exit: { cpu_id = 0 }, { pthread_id = 140267464296512 }, { retval = 31232 } [11:41:53.228001617] (+0.001271598) issdm-45 librbd:aio_complete_enter: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190, rval = 31232 } [11:41:53.228007204] (+0.000005587) issdm-45 librbd:aio_get_return_value_enter: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190 } [11:41:53.228009718] (+0.000002514) issdm-45 librbd:aio_get_return_value_exit: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { retval = 31232 } [11:41:53.228016702] (+0.000006984) issdm-45 librbd:aio_complete_exit: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { } 25 RBD
  • 26. What is tracing & why should I care? ● Tracing allows us to see exactly what happens inside the system [11:41:53.226668003] (+0.000270968) issdm-45 librbd:aio_read_enter: { cpu_id = 0 }, { pthread_id = 140267464296512 }, { imagectx = 0x7F929308F600, name = "kubuntu", snap_name = "", read_only = 0, offset = 2078900224, length = 31232, completion = 0x7F92935AE190 } [11:41:53.226730019] (+0.000062016) issdm-45 librbd:aio_read_exit: { cpu_id = 0 }, { pthread_id = 140267464296512 }, { retval = 31232 } [11:41:53.228001617] (+0.001271598) issdm-45 librbd:aio_complete_enter: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190, rval = 31232 } [11:41:53.228007204] (+0.000005587) issdm-45 librbd:aio_get_return_value_enter: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190 } [11:41:53.228009718] (+0.000002514) issdm-45 librbd:aio_get_return_value_exit: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { retval = 31232 } [11:41:53.228016702] (+0.000006984) issdm-45 librbd:aio_complete_exit: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { } 26 RBD
  • 27. What is tracing & why should I care? ● Tracing allows us to see exactly what happens inside the system [11:41:53.226668003] (+0.000270968) issdm-45 librbd:aio_read_enter: { cpu_id = 0 }, { pthread_id = 140267464296512 }, { imagectx = 0x7F929308F600, name = "kubuntu", snap_name = "", read_only = 0, offset = 2078900224, length = 31232, completion = 0x7F92935AE190 } [11:41:53.226730019] (+0.000062016) issdm-45 librbd:aio_read_exit: { cpu_id = 0 }, { pthread_id = 140267464296512 }, { retval = 31232 } [11:41:53.228001617] (+0.001271598) issdm-45 librbd:aio_complete_enter: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190, rval = 31232 } [11:41:53.228007204] (+0.000005587) issdm-45 librbd:aio_get_return_value_enter: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190 } [11:41:53.228009718] (+0.000002514) issdm-45 librbd:aio_get_return_value_exit: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { retval = 31232 } [11:41:53.228016702] (+0.000006984) issdm-45 librbd:aio_complete_exit: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { } 27 RBD
  • 28. What is tracing & why should I care? ● Tracing allows us to see exactly what happens inside the system [11:41:53.226668003] (+0.000270968) issdm-45 librbd:aio_read_enter: { cpu_id = 0 }, { pthread_id = 140267464296512 }, { imagectx = 0x7F929308F600, name = "kubuntu", snap_name = "", read_only = 0, offset = 2078900224, length = 31232, completion = 0x7F92935AE190 } [11:41:53.226730019] (+0.000062016) issdm-45 librbd:aio_read_exit: { cpu_id = 0 }, { pthread_id = 140267464296512 }, { retval = 31232 } [11:41:53.228001617] (+0.001271598) issdm-45 librbd:aio_complete_enter: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190, rval = 31232 } [11:41:53.228007204] (+0.000005587) issdm-45 librbd:aio_get_return_value_enter: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190 } [11:41:53.228009718] (+0.000002514) issdm-45 librbd:aio_get_return_value_exit: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { retval = 31232 } [11:41:53.228016702] (+0.000006984) issdm-45 librbd:aio_complete_exit: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { } 28 RBD
  • 29. What is tracing & why should I care? ● Tracing allows us to see exactly what happens inside the system [11:41:53.226668003] (+0.000270968) issdm-45 librbd:aio_read_enter: { cpu_id = 0 }, { pthread_id = 140267464296512 }, { imagectx = 0x7F929308F600, name = "kubuntu", snap_name = "", read_only = 0, offset = 2078900224, length = 31232, completion = 0x7F92935AE190 } [11:41:53.226730019] (+0.000062016) issdm-45 librbd:aio_read_exit: { cpu_id = 0 }, { pthread_id = 140267464296512 }, { retval = 31232 } [11:41:53.228001617] (+0.001271598) issdm-45 librbd:aio_complete_enter: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190, rval = 31232 } [11:41:53.228007204] (+0.000005587) issdm-45 librbd:aio_get_return_value_enter: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { completion = 0x7F92935AE190 } [11:41:53.228009718] (+0.000002514) issdm-45 librbd:aio_get_return_value_exit: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { retval = 31232 } [11:41:53.228016702] (+0.000006984) issdm-45 librbd:aio_complete_exit: { cpu_id = 1 }, { pthread_id = 140266098906880 }, { } 29 RBD
  • 30. With tracing anything is possible 30 Queue Depth over TimeLatency vs Sector Size
  • 31. Example: Ceph Request Latency 31
  • 32. Trace processing pipeline 32 ● Processing step examines trace events ● Typically written in Python ● Looking for pairs is a common pattern ○ Time spent in queue ○ Time spent in I/O ○ Client processing time ● Requires knowledge of internal workings
  • 33. Zipkin, Blkin, and LTTng 33 ● Dapper is a Google system ○ Traces causal relationships ● Zipkin implemented by Twitter ○ Look at the pretty GUI ○ Ignores data sources ● Huge number of raw LTTng tracepoints in Ceph ○ LTTng → Zipkin (Blkin) ■ Marios Kogias ○ Andrew Shewmaker ○ Adam Crume
  • 34. Getting started with tracing! ● Lots of tracepoints exist! ○ Adding new points is easy :) ● RBD-Replay ○ Collect and replay RBD traces ○ http://ceph.com/docs/master/rbd/rbd-replay/ ● Adding points and discussion http://noahdesu.github.io/2014/06/01/tracing-ceph-with- lttng-ust.html 34 TRACEPOINT_EVENT(librados, rados_write_enter, TP_ARGS( rados_ioctx_t, ioctx, const char*, oid, const void*, buf, size_t, len, uint64_t, off), TP_FIELDS( ctf_integer_hex(rados_ioctx_t, ioctx, ioctx) ctf_string(oid, oid) ) )
  • 36. A different version of a better talk ● The objects in RADOS can have arbitrary code associated with them ○ Think: “remotely compress object “foo”, please.” ● "Distributed Storage and Compute with Ceph’s librados” ○ Great talk by Sage Weil ○ Check out YouTube ● Scripting compute with librados 36
  • 37. How does an OSD handle a request? 37 Client OSDlibrados read-object(foo) read-object transaction ● Client reads an object from an OSD ● The OSD executes a “read” operation ○ The read operation knows how to access data managed by the OSD ● All operations are executed in a transactional context ● Exact function can be swapped out
  • 38. What are RADOS object classes? 38 Client OSDlibrados get-md5(foo) transaction ● Client writes some C++ code ● Compiles it into an OSD plugin ● After installing this code can be invoked ● Avoids data transfer ○ Can cache results ● Can simplify application design MD5-Hash out-of-band install
  • 39. Example RADOS object class plugin int compute_md5(cls_method_context_t hctx, bufferlist *in, bufferlist *out) { size_t size; int ret = cls_cxx_stat(hctx, &size, NULL); if (ret < 0) return ret; bufferlist data; ret = cls_cxx_read(hctx, 0, size, data); if (ret < 0) return ret; byte digest[AES::BLOCKSIZE]; MD5().CalculateDigest(digest, (byte*)data.c_str(), data.length()); out->append(digest, sizeof(digest)); return 0; } 39
  • 40. Example RADOS object class plugin int compute_md5(cls_method_context_t hctx, bufferlist *in, bufferlist *out) { size_t size; int ret = cls_cxx_stat(hctx, &size, NULL); if (ret < 0) return ret; bufferlist data; ret = cls_cxx_read(hctx, 0, size, data); if (ret < 0) return ret; byte digest[AES::BLOCKSIZE]; MD5().CalculateDigest(digest, (byte*)data.c_str(), data.length()); out->append(digest, sizeof(digest)); return 0; } 40 Input provided by client, and output returned to client.
  • 41. Example RADOS object class plugin int compute_md5(cls_method_context_t hctx, bufferlist *in, bufferlist *out) { size_t size; int ret = cls_cxx_stat(hctx, &size, NULL); if (ret < 0) return ret; bufferlist data; ret = cls_cxx_read(hctx, 0, size, data); if (ret < 0) return ret; byte digest[AES::BLOCKSIZE]; MD5().CalculateDigest(digest, (byte*)data.c_str(), data.length()); out->append(digest, sizeof(digest)); return 0; } 41 Input provided by client, and output returned to client. Stat the object to query its size.
  • 42. Example RADOS object class plugin int compute_md5(cls_method_context_t hctx, bufferlist *in, bufferlist *out) { size_t size; int ret = cls_cxx_stat(hctx, &size, NULL); if (ret < 0) return ret; bufferlist data; ret = cls_cxx_read(hctx, 0, size, data); if (ret < 0) return ret; byte digest[AES::BLOCKSIZE]; MD5().CalculateDigest(digest, (byte*)data.c_str(), data.length()); out->append(digest, sizeof(digest)); return 0; } 42 Input provided by client, and output returned to client. Stat the object to query its size. Read the entire object into a buffer.
  • 43. Example RADOS object class plugin int compute_md5(cls_method_context_t hctx, bufferlist *in, bufferlist *out) { size_t size; int ret = cls_cxx_stat(hctx, &size, NULL); if (ret < 0) return ret; bufferlist data; ret = cls_cxx_read(hctx, 0, size, data); if (ret < 0) return ret; byte digest[AES::BLOCKSIZE]; MD5().CalculateDigest(digest, (byte*)data.c_str(), data.length()); out->append(digest, sizeof(digest)); return 0; } 43 Input provided by client, and output returned to client. Stat the object to query its size. Read the entire object into a buffer. Pass this data buffer to the MD5 algorithm
  • 44. Example RADOS object class plugin int compute_md5(cls_method_context_t hctx, bufferlist *in, bufferlist *out) { size_t size; int ret = cls_cxx_stat(hctx, &size, NULL); if (ret < 0) return ret; bufferlist data; ret = cls_cxx_read(hctx, 0, size, data); if (ret < 0) return ret; byte digest[AES::BLOCKSIZE]; MD5().CalculateDigest(digest, (byte*)data.c_str(), data.length()); out->append(digest, sizeof(digest)); return 0; } 44 Input provided by client, and output returned to client. Stat the object to query its size. Read the entire object into a buffer. Pass this data buffer to the MD5 algorithm Return the MD5 digest to the client.
  • 45. Example RADOS object class plugin int compute_md5(cls_method_context_t hctx, bufferlist *in, bufferlist *out) { size_t size; int ret = cls_cxx_stat(hctx, &size, NULL); if (ret < 0) return ret; bufferlist data; ret = cls_cxx_read(hctx, 0, size, data); if (ret < 0) return ret; byte digest[AES::BLOCKSIZE]; MD5().CalculateDigest(digest, (byte*)data.c_str(), data.length()); out->append(digest, sizeof(digest)); return 0; } 45 Input provided by client, and output returned to client. Stat the object to query its size. Read the entire object into a buffer. Pass this data buffer to the MD5 algorithm Return the MD5 digest to the client. All in a transactional context.
  • 46. Dynamic object classes with Lua 46 Client OSDlibrados call-lua(script, foo) transaction ● Lua is great as an embedded language ● LuaJIT is a high-performance implementation ● Allow clients to construct and modify object classes without compiling or restarting OSDs LuaJIT VM dynamically generated interface
  • 47. Example: Lua Thumbnail Generator function thumb(input, output) -- apply thumbnail spec to original image local spec_string = input:str() local blob = get_orig_img() local img = assert(magick.load_image_from_blob(blob:str())) img = magick.thumb(img, spec_string) -- append thumbnail to object local obj_size = cls.stat() local img_bl = bufferlist.new() img_bl:append(img) cls.write(obj_size, #img_bl, img_bl) -- save location in leveldb local loc_spec = #img_bl .. "@" .. obj_size local loc_spec_bl = bufferlist.new() loc_spec_bl:append(loc_spec) cls.map_set_val(spec_string, loc_spec_bl) end 47 Original Ver.1 Ver.2 Ver.3 Thumbnail Index ● Read object and apply ImageMagick transformation ● Append (cache) the new version of the image to the object ● Save the location of the version indexed by its specification ● Write a smart read function to consult the cache ● Application can dynamically alter the transformation applied App-specific Object Interface
  • 48. Example: Lua Thumbnail Generator function thumb(input, output) -- apply thumbnail spec to original image local spec_string = input:str() local blob = get_orig_img() local img = assert(magick.load_image_from_blob(blob:str())) img = magick.thumb(img, spec_string) -- append thumbnail to object local obj_size = cls.stat() local img_bl = bufferlist.new() img_bl:append(img) cls.write(obj_size, #img_bl, img_bl) -- save location in leveldb local loc_spec = #img_bl .. "@" .. obj_size local loc_spec_bl = bufferlist.new() loc_spec_bl:append(loc_spec) cls.map_set_val(spec_string, loc_spec_bl) end 48 Original Ver.1 Ver.2 Ver.3 Thumbnail Index ● Read object and apply ImageMagick transformation ● Append (cache) the new version of the image to the object ● Save the location of the version indexed by its specification ● Write a smart read function to consult the cache ● Application can dynamically alter the transformation applied App-specific Object Interface
  • 49. Example: Lua Thumbnail Generator function thumb(input, output) -- apply thumbnail spec to original image local spec_string = input:str() local blob = get_orig_img() local img = assert(magick.load_image_from_blob(blob:str())) img = magick.thumb(img, spec_string) -- append thumbnail to object local obj_size = cls.stat() local img_bl = bufferlist.new() img_bl:append(img) cls.write(obj_size, #img_bl, img_bl) -- save location in leveldb local loc_spec = #img_bl .. "@" .. obj_size local loc_spec_bl = bufferlist.new() loc_spec_bl:append(loc_spec) cls.map_set_val(spec_string, loc_spec_bl) end 49 Original Ver.1 Ver.2 Ver.3 Thumbnail Index ● Read object and apply ImageMagick transformation ● Append (cache) the new version of the image to the object ● Save the location of the version indexed by its specification ● Write a smart read function to consult the cache ● Application can dynamically alter the transformation applied App-specific Object Interface
  • 50. Example: Lua Thumbnail Generator function thumb(input, output) -- apply thumbnail spec to original image local spec_string = input:str() local blob = get_orig_img() local img = assert(magick.load_image_from_blob(blob:str())) img = magick.thumb(img, spec_string) -- append thumbnail to object local obj_size = cls.stat() local img_bl = bufferlist.new() img_bl:append(img) cls.write(obj_size, #img_bl, img_bl) -- save location in leveldb local loc_spec = #img_bl .. "@" .. obj_size local loc_spec_bl = bufferlist.new() loc_spec_bl:append(loc_spec) cls.map_set_val(spec_string, loc_spec_bl) end 50 Original Ver.1 Ver.2 Ver.3 Thumbnail Index ● Read object and apply ImageMagick transformation ● Append (cache) the new version of the image to the object ● Save the location of the version indexed by its specification ● Write a smart read function to consult the cache ● Application can dynamically alter the transformation applied App-specific Object Interface
  • 51. Example: Lua Thumbnail Generator function thumb(input, output) -- apply thumbnail spec to original image local spec_string = input:str() local blob = get_orig_img() local img = assert(magick.load_image_from_blob(blob:str())) img = magick.thumb(img, spec_string) -- append thumbnail to object local obj_size = cls.stat() local img_bl = bufferlist.new() img_bl:append(img) cls.write(obj_size, #img_bl, img_bl) -- save location in leveldb local loc_spec = #img_bl .. "@" .. obj_size local loc_spec_bl = bufferlist.new() loc_spec_bl:append(loc_spec) cls.map_set_val(spec_string, loc_spec_bl) end 51 Original Ver.1 Ver.2 Ver.3 Thumbnail Index ● Read object and apply ImageMagick transformation ● Append (cache) the new version of the image to the object ● Save the location of the version indexed by its specification ● Write a smart read function to consult the cache ● Application can dynamically alter the transformation applied App-specific Object Interface
  • 52. Getting started with scripted RADOS ● Buyer beware! ○ Experimental code ○ Works and fairly stable ● Code available on github ○ http://github.com/ceph/ceph ○ branch: cls-lua ● In-depth explanation and examples ○ http://ceph.com/rados/dynamic-object-interfaces-with-lua/ 52
  • 53. That’s it! ● Lot’s of interesting development ● Ceph is a great platform for experimentation ● Q&A 53